
[프로그래머스] 기능개발(Java)
zl존석동
·2022. 1. 13. 19:47
프로그래머스 Level 2 - 기능개발 자바 풀이
코딩테스트 연습 - 기능개발
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는
programmers.co.kr
문제 요약 설명
배열로 현재 작업도와 각 작업들의 1일 당 처리가능한 작업량이 주어진다.
작업이 100% 가 되는 날 배포를 하는데 하루에 여러 작업을 배포할 수는 있지만
먼저 존재하는(배열의 앞에 위치하는) 작업이 배포가 불가능하면 뒤에 있는 작업도 배포가 불가능하다.
나의 풀이
일단 주어진 int[] progresses, int[] speeds 를 활용하여 현재 존재하는 모든 작업들이 며칠 뒤에 끝나는지 (100% 이상이 되는지) 를 구해 배열에 저장한다.
한 개의 작업에 대해 현재까지 진행도를 P, 하루 작업량을 S 라고 한다면 다음과 같은 공식으로 앞으로 작업해야할 일 수를 구할 수 있다.
RESULT = (int) Math.ceil( ( 100-P ) / (Double) S )
올림을 해야 하는 이유는 앞으로 해야할 작업이 5만큼 남았는데 하루에 6만큼 할 수 있을 때 며칠이 걸리는지와 5만큼 남았는데 하루에 5만큼 할 수 있을 때 며칠이 걸리는지를 생각해보면 될 것 같다.
이렇게 배열의 각 작업들에 대해 작업해야할 일 수를 구하고
첫 작업을 기준으로 더 오래걸리는 작업이 나올 때 까지를 한 묶음의 배포로 보고
그 다음 작업을 기준으로 더 오래걸리는 작업이 나올 때 까지를 한 묶음의 배포로 보는식으로 해서 배열에 넣어주면 된다.
progresses | speeds | return |
[95, 81, 99, 99, 80, 99] | [1, 1, 1, 1, 1, 1] | [1, 3, 2] |
위의 입력이 들어왔다고 생각해보자.
각 작업을 모두 완료하는데 걸리는 일 수는 다음과 같을 것이다.
TodoDay |
[5,19,1,1,20,1] |
첫 작업은 5만큼 걸린다. 이걸 큐에 넣어주자.
다음 작업은 19이기 때문에 앞에서 5일동안 일해서 하나의 작업을 완료했다 하더라도 완료될 수 없다.
큐에 있는 작업을 모두 꺼내 하나의 배포로 만들어준다. 이 때 배포되는 작업은 단 한개.
이제 두번째 작업인 19를 큐에 넣어준다. 이 작업 끝내는데 19일 걸린다는 소리다.
두번째 작업을 마치는데 19일이 소요되는 것이니 각각 1일씩걸리는 3,4번째 작업들은 이미 같이 완료되어있을 것이다.
5번째 작업은 20일이 소요되기때문에 19일이 소요되는 두번째 작업이 완료되는 시점에도 완료되지 못했을 것이다.
따라서 2번째 작업과 같이 완료될 3,4번째 작업들만 큐에 넣어주는 것이다.
이렇게 2,3,4번째 작업들을 또 하나의 배포라고 볼 수 있겠다.
이 3개의 작업들을 하나의 배포로 만들어주고 큐에서 모두 제거한다.
똑같이 20일이 걸리는 5번째 작업을 큐에 넣고 이것보다 오래 걸리는 작업이 나올때까지 모든 작업을 큐에 넣어줘 하나의 배포로 만들면 된다.
그렇게 되면 나오게 되는 모든 배포의 결과는 다음과 같을 것이다.
Result |
[1,3,2] |
자바 풀이 코드
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
List<Integer> answerList = new ArrayList<>();
int len = progresses.length;
int[] toDoDate = new int[len];
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < len; i++) {
toDoDate[i] = (int) Math.ceil((100 - progresses[i]) / (double) speeds[i]);
if (!queue.isEmpty() && toDoDate[i] > queue.peek()) {
answerList.add(queue.size());
queue.clear();
}
queue.add(toDoDate[i]);
}
answerList.add(queue.size());
return answerList.stream().mapToInt(i->i).toArray();
}
}
'알고리즘 & 자료구조 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 스킬트리 (java) (0) | 2022.08.24 |
---|---|
[프로그래머스] 파일명 정렬 (java) (0) | 2022.08.15 |
[프로그래머스] 파괴되지 않은 건물(java) (0) | 2022.07.18 |
[프로그래머스] 소수찾기 (Java) (0) | 2022.02.03 |
[프로그래머스] 다리를 지나는 트럭 (java) (0) | 2022.01.13 |