본문 바로가기

Archived(CSE Programming)/알고리즘(C++)

프로그래머스_라면 공장

https://programmers.co.kr/learn/courses/30/lessons/42629

 

코딩테스트 연습 - 라면공장 | 프로그래머스

라면 공장에서는 하루에 밀가루를 1톤씩 사용합니다. 원래 밀가루를 공급받던 공장의 고장으로 앞으로 k일 이후에야 밀가루를 공급받을 수 있기 때문에 해외 공장에서 밀가루를 수입해야 합니다. 해외 공장에서는 향후 밀가루를 공급할 수 있는 날짜와 수량을 알려주었고, 라면 공장에서는 운송비를 줄이기 위해 최소한의 횟수로 밀가루를 공급받고 싶습니다. 현재 공장에 남아있는 밀가루 수량 stock, 밀가루 공급 일정(dates)과 해당 시점에 공급 가능한 밀가루 수량

programmers.co.kr

Heap , LV2

해당 문제는 Heap으로 해결하였다.

day라는 날짜를 세는 변수를 주고 day와 stock을 통해 상황을 시뮬레이션한다.

그러다 date를 지나면 할 수 있었던 계약들을 heap에 넣고 stock이 0이 되는 순간 할 수 있었던 계약 중 가장 많은 양의 계약을 heap으로부터 뽑아온다. 이러한 구조로 계약을 몇번 해야하는지를 반환하면 된다.

#include <string>
#include <vector>
#include <queue>
using namespace std;

int solution(int stock, vector<int> dates, vector<int> supplies, int k) {
    int answer = 0;
    priority_queue<int, vector<int>, less<int>> pq;
    
    // 날짜 맞춰서 진행
    int day = 0, idx = 0;
    while(day < k){
        // 수입을 고려할 수 있으면
        if(day >= dates[idx]){
            pq.push(supplies[idx]);
            idx = idx +1;
        }
        // stock이 다 떨어지면 가장 큰 밀가루 충전
        if(stock == 0){
            stock += pq.top();
            pq.pop();
            answer++; // 한 개 더 사용
        }
        day++; // 하루 지남
        stock--; // 하루 지남
    }
    return answer;
}