프로그래머스 - [기능개발] 42586
2022. 3. 12. 16:17ㆍ프로그래머스
문제 링크:
코딩테스트 연습 - 기능개발 | 프로그래머스 (programmers.co.kr)
위 예시에서 각 진도에 따라 걸리는 시간은 정해져 있습니다.
100 - progresses 를 한 후에 speeds 로 나누면 되는 것이죠. 소수점이 나올경우 올림을 하면 됩니다.
걸리는 시간을 times 라고 한다면
times: [7, 3, 9]
[5, 10, 1, 1, 20, 1] 라고 할 수 있습니다.
위처럼 손쉽게 걸리는 시간을 구할 수 있습니다.
times 배열의 특징은 순차적으로 처리가 이뤄져야 한다는 것입니다.
{ 7, 3, 9 } 의 경우 3 이 7보다 작으므로 같이 묶여서 처리된다는 의미이고
9의 경우에는 (7, 3)이 1주일 동안 처리되고 난 후 2일 후에(7+2=9) 처리가 완료된다는 의미입니다.
따라서 우리는 times 값들을 순차적으로 큐에 담은 후, 큐의 front 값보다 큰 값이 들어올 경우에만
queue에 담긴 값들을 묶어서 내보내면 됩니다.
정답 소스코드
public int[] solution(int[] progresses, int[] speeds) {
List<Integer> list = new ArrayList<>();
ArrayList<Integer> times = new ArrayList<>();
Queue<Integer> que = new LinkedList<>();
for(int i=0;i<progresses.length;i++){
int workLeft = 100 - progresses[i]; // 남은 일
double time = (double)workLeft / (double)speeds[i]; // 걸리는 시간
time = Math.ceil(time);
times.add((int)time); // 걸리는 시간
}
que.add(times.get(0));
for(int i=1; i< times.size(); i++){
int frontVal = que.peek();
if(times.get(i) <= frontVal){
que.add(times.get(i));
}else{ // times.get(i) > frontval
int count = 0;
while(!que.isEmpty()){
que.poll(); // 하나씩 빼준다.
count++;
}
que.add(times.get(i));
list.add(count);
}
}
int count = 0;
while(!que.isEmpty()){
count++;
que.poll();
}
list.add(count);
int[] answer = new int[list.size()];
for(int i=0;i<list.size();i++){
answer[i] = list.get(i);
}
return answer;
}
'프로그래머스' 카테고리의 다른 글
프로그래머스 - [다리를 지나는 트럭] 42583 (0) | 2022.03.13 |
---|---|
프로그래머스 - [프린터] 42587 (0) | 2022.03.13 |
프로그래머스 - [베스트앨범] 42579 (0) | 2022.02.20 |
[전화번호 목록] - 42577 (0) | 2022.02.18 |
시리얼 번호 - 백준 1431 (0) | 2022.02.16 |