프로그래머스 알고리즘 (java)
라면 공장
코드 리뷰
현재 공장에 남아있는 밀가루 수량 stock
, 밀가루 공급 일정(dates
)과 해당 시점에 공급 가능한 밀가루 수량(supplies
), 원래 공장으로부터 공급받을 수 있는 시점 k
가 주어질 때, 밀가루가 떨어지지 않고 공장을 운영하기 위해서 최소한 몇 번 해외 공장으로부터 밀가루를 공급받아야 하는지를 return 하도록 solution 함수를 완성하세요.
조건
- stock에 있는 밀가루는 오늘(0일 이후)부터 사용됩니다.
- stock과 k는 2 이상 100,000 이하입니다.
- dates의 각 원소는 1 이상 k 이하입니다.
- supplies의 각 원소는 1 이상 1,000 이하입니다.
- dates와 supplies의 길이는 1 이상 20,000 이하입니다.
- k일 째에는 밀가루가 충분히 공급되기 때문에 k-1일에 사용할 수량까지만 확보하면 됩니다.
- dates에 들어있는 날짜는 오름차순 정렬되어 있습니다.
- dates에 들어있는 날짜에 공급되는 밀가루는 작업 시작 전 새벽에 공급되는 것을 기준으로 합니다. 예를 들어 9일째에 밀가루가 바닥나더라도, 10일째에 공급받으면 10일째에는 공장을 운영할 수 있습니다.
- 밀가루가 바닥나는 경우는 주어지지 않습니다.
풀이 방향
저는 날짜를 기준으로 풀었습니다.
날짜를 for
문의 기준으로 삼고 현재 날짜와( i
) 해외에서 배송해 줄 수 있는 날짜( dates
) 를 비교해 같은 날이면 우선순위 큐에 담았습니다.
그리고 날짜와 현재 가지고 있는 밀가루량( stock
) 이 같으면 가장 많은량의 밀가루를 가져오게 했습니다.
import java.util.Comparator;
import java.util.PriorityQueue;
class Solution {
public int solution(int stock, int[] dates, int[] supplies, int k) {
int answer = 0;
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Comparator.reverseOrder());
int index = 0;
for (int i = 0; i < k; i++) {
if (index < dates.length) {
if (i == dates[index]) {
priorityQueue.offer(supplies[index]);
index ++;
}
}
if (i == stock) {
stock += priorityQueue.remove();
answer ++;
}
}
return answer;
}
}