🔗 문제 링크
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📝 문제 설명
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
⚠️ 제한 사항
- 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
- 작업 진도는 100 미만의 자연수입니다.
- 작업 속도는 100 이하의 자연수입니다.
- 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
✨ 내 코드
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
// 순서와 남은 진도를 덱에 add
ArrayDeque<int[]> remains = new ArrayDeque<>();
for(int i = 0; i < progresses.length; i++) {
int[] remain = {i, 100 - progresses[i]};
remains.addLast(remain);
}
ArrayList<Integer> answer = new ArrayList<>();
while (!remains.isEmpty()) {
// 일단 한 바퀴 돌리기
for (int i = 0; i < remains.size(); i++) {
int[] remain = remains.pollFirst();
remain[1] -= speeds[remain[0]];
remains.addLast(remain);
}
int count = 0; // 배포되는 기능의 개수
int repeat = remains.size(); // 현재 남은 기능 개수 (for문 안의 poll에 영향받지 않도록)
int current1st = remains.peek()[0]; // 지금 1순위로 배포되어야하는 기능의 idx
boolean flag = false; // answer 추가 flag
for (int i = 0; i < repeat; i++) {
int[] remain = remains.pollFirst();
// 현재 배포되어야 하는 순서이며 0보다 작음
if(remain[0] == current1st && remain[1] <= 0) {
count++;
current1st++;
flag = true;
} else {
remains.addLast(remain); // 해당 없으면 그대로 뒤에 추가
}
}
if(flag)
answer.add(count);
}
// ArrayList<Integer> -> Array<int>
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}
💡 풀이
- 각 기능의 배포 순서와 남은 진도를 큐로 만든다
- 남은 기능이 없을 때까지 while문 반복
- 남은 기능의 진도를 나간다
- 배포할지 결정한다
- 현재 배포되어야 할 순서이며 남은 진도가 0보다 작으면
- count, current1st(현재 배포 1순위)를 각각 +1
- answer 추가 flag를 true로
- 1에 해당 없다면 그대로 뒤에 추가
- 1,2가 끝나고 flag 값에 따라 count를 ArrayList에 추가
- 현재 배포되어야 할 순서이며 남은 진도가 0보다 작으면
💭 회고
순서를 유지하면서 앞 순서가 배포될 때 뒷 순서를 같이 나가게 하고 배포마다 몇 개의 기능이 배포되는지 체크하는 방법을 떠올리는 것이 조금 어려웠다. 그리고 기능도 객체로 따로 뺄 수 있을 것 같다는 생각이 든다.
책에서는 각 기능의 배포 가능일을 기준으로 for문 돌려서 구하는데 이렇게 구하면 큐랑 상관이 있나..? 아무튼 배포 가능일이라는 요소 하나로 문제를 해결할 수 있다는 점이 흥미롭다. 여러 데이터 중 어떤 값을 이용할지 정하는 것이 중요하면서 어려운 일 같다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
| [Java] Lv2. 오픈채팅방 (0) | 2025.07.06 |
|---|---|
| [Java] Lv3. 베스트앨범 (0) | 2025.07.06 |
| [Java] Lv1. 카드 뭉치 (0) | 2025.06.07 |
| [Java] Lv.2 다리를 지나는 트럭 (0) | 2025.06.07 |
| [Java] Lv2. 올바른 괄호 (1) | 2025.06.01 |