[문제풀이] 라면공장
업데이트:
문제 링크 : 라면공장
풀이 시간 : 20분
1. 문제 풀이
최소한의 밀가루 공급 횟수를 찾는 문제
현재부터 버틸 수 있는 날까지 최대 공급을 더해주면서
버틸 수 있는 날이 자체 생산(k 일)을 넘길 때까지 반복
Heap을 이용하여 최대 공급량을 뽑아 낸다.
1) 버틸 수 있는 날이 k 이상이면 종료
2) 버틸 수 있는 날까지 공급 가능한 밀가루 양을 Heap 넣는다.
3) Heap에서 poll() 통해 가장 많은 공급량을 뽑아서 현재 밀가루 양에 더한다.
1~3번 반복을 통해 공급 횟수를 찾는다.
2. 소스 코드
static public int solution(int stock, int[] dates, int[] supplies, int k) {
int answer = 0;
PriorityQueue<Integer> q = new PriorityQueue<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.intValue()-o1.intValue();
}
});
int pivot_dates = 0;
// 며칠까지 버틸 수 있는지
int sum = stock;
while(true) {
// 다시 밀가루가 공급되는 날보다 커지면 종료
if(sum>=k) {
break;
}
while(pivot_dates<dates.length) {
// 최대 버틸 수 있는 날 전까지 공급 받을 수 있는 날 검사
if(dates[pivot_dates]<=sum) {
// 공급 받을 수 있는 양 저장
q.add(supplies[pivot_dates]);
pivot_dates++;
}else {
break;
}
}
// 최대 버틸 수 있는 날까지 최대의 공급량을 더한다.
sum += q.poll();
answer++;
}
return answer;
}
3. 후기
Heap을 통해 최대한의 공급량을 뽑아 내는 문제 였다