카테고리 없음
[알고리즘] 기능 개발
sandbackend
2023. 1. 23. 16:49
https://school.programmers.co.kr/learn/courses/30/lessons/42586
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
- 정해진 순서대로만 배포가 가능하기 때문에 현재 기능이 완료됐다고 하더라도 앞의 기능이 완료되지 않으면 배포가 불가능하다. 그렇기에 입력 순서대로 반환하는 Queue를 사용 했다.

- 기능구현이 완료되는 시간을 구해 Queue에 순차적으로 넣기 위해 값을 계산 했다.
그런데 이렇게 하니 테스트 11에서 실패를 한다.

- 소수점자리까지 구해야한다. 만약 5.5와 같이 소수점이 나오게 되면 실제 배포일은 6일 이기 떄문에 Math.ceil을 통해 올림해주자.

- Queue.poll()을 통해 현재 기능이 완료되는 일자를 꺼내오고 Queue를 차례대로 보며 현재 꺼내온 날짜에 이미 구현이 완료된기능들을 Queue에서 제거하며 개수를 증가시켜주었다. 현재 완료된 기능이 더 이상 없다면 List에 개수를 추가하고 다음 기능이 완료 되도록 반복문을 돌려주 었다.

완성코드
static class Solution {
public int[] solution(int[] progresses, int[] speeds) {
// 1.남은 작업 일 수를 저장할 큐
Queue<Integer> queue = new LinkedList<>();
for (int i=0; i<progresses.length; i++) {
// 남은 작업일을 계산하여 큐에 추가
queue.add((int)(Math.ceil((100.0-progresses[i]) / speeds[i])));
}
// 2. 현재 작업일과 다음 작업일을 비교
List<Integer> arr = new ArrayList<>();
while (!queue.isEmpty()) {
int day = queue.poll();
int cnt = 1;
while (!queue.isEmpty() && day >= queue.peek()) {
cnt++;
queue.poll();
}
arr.add(cnt);
}
// 3. ArrayList를 배열로 변환
int[] answer = new int[arr.size()];
for (int i=0; i<answer.length; i++) {
answer[i] = arr.get(i);
}
return answer;
}
}