문제 : https://programmers.co.kr/learn/courses/30/lessons/42586
코딩테스트 연습 - 기능개발
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는
programmers.co.kr
내가 짠 코드 (.java)
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
int count = 1;
int cur = 0;
List<Integer> days = new ArrayList<>();
List<Integer> answers = new ArrayList<>();
for (int i = 0; i <progresses.length; i++) {
int day = 0;
int num = 100 - progresses[i];
if(num % speeds[i] != 0){
day = (100-progresses[i]) / speeds[i];
day += 1;
}
else{
day = (100-progresses[i]) / speeds[i];
}
days.add(day);
//System.out.println(day);
}
for (int i = 0; i < days.size()-1 ; i++) {
if(days.get(i+1)>days.get(cur)){
answers.add(count);
count = 1;
cur = i+1;
//continue;
}
else count += 1;
if(i+1==days.size()-1) answers.add(count);
}
answer = answers.stream().mapToInt(i->i).toArray();
return answer;
}
}
설명
해당 코드는 진도와 개발 속도를 계산하여 해당 진도를 100%로 완료하기 위해서 걸리는 시간을 계산한 것입니다.
num과 개발 속도의 나머지가 0으로 떨어지는 경우 하루 더 셀 필요가 없으므로 그대로 몫 값을 day로 설정합니다.
그러나 나머지가 남는 경우는 하루 더 셀 필요가 있습니다.
예를 들어, 개발 진행 속도는 32퍼센트이고 개발 속도는 3인경우 num은 68이 되겠고 num에서 개발 속도 3을 나눈 몫(68/3=22)은 22가 되겠습니다. 그러나 3*22는 68일보다 적습니다. 그러므로 하루가 더 필요한 것이죠.
그렇기 때문에 나머지가 0으로 떨어지지 않는 경우 day를 하루 더 증가시켜주었습니다.
해당 코드는 남은 날짜를 계산한 리스트를 가지고 하루에 몇개의 기능이 배포될 수 있는지 계산하는 코드입니다.
cur 변수는 현재 위치를 가르치며 현재 값보다 오래 걸리는 기간이 나온다면 현재 위치를 해당 위치로 바꾸어 줍니다.
continue를 주석처리 한 이유는 38번째 명령문을 마지막 i+1이 continue때문에 그냥 다음 반복으로 넘어가 마지막 day를 count하지 않는 경우가 생겨 주석처리 하였습니다. 만약에 i+1가 20이면서 마지막 인덱스이고 cur이 1이라면 현재 count를 answers에 넣어주고 38번째 if문으로 돌아가 마지막 count = 1 도 answers에 넣어주어야 합니다.
i+1이므로 i의 반복 범위는 size-1로 해주었습니다. (인덱스예외방지)
해당 코드는 ArrayList를 배열 형태로 바꿔주는 람다식입니다.
stream()은 해당 ArrayList의 모든 원소를 다 꺼냅니다. mapToInt를 통해 Integer값을 int형으로 변경시켜줍니다. 마지막에 toArray()를 통해 stream을 배열로 변경시켜줍니다.
해당 방법을 채택한 이유는 모든 원소를 복사해 옮기는 방법보다 다른 방법을 사용해보고 싶었습니다.
위의 코드는 오류가 있을 수 있으며 해당 오류를 공유해주신다면 감사하겠습니다.
긴 글 봐주셔서 감사합니다. 오늘도 열공하세요 ^^
'Algorithm > Programmers' 카테고리의 다른 글
[Java | programmers] 정규표현식(regex) (0) | 2023.03.13 |
---|---|
[프로그래머스|최대공약수와 최소공배수] 유클리드 호제법 (0) | 2022.08.31 |
[프로그래머스|숫자 문자열과 영단어] replaceAll 함수 (0) | 2022.08.29 |
[프로그래머스] 모의고사 (0) | 2022.08.09 |
[프로그래머스]Level2 주식가격<java> (0) | 2022.02.18 |