알고리즘/프로그래머스 2단계

프로그래머스 - 더 맵게 - C++

게임만드는학생 2024. 8. 2. 13:36

https://school.programmers.co.kr/learn/courses/30/lessons/42626

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

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

int solution(vector<int> scoville, int K) {
    int answer = 0;
    priority_queue<int,vector<int>, greater<int>> pq;
    
    for(int i=0;i<scoville.size();i++)
        pq.push(scoville[i]);
    
    int t1,t2;
    while(pq.size()>=2&&pq.top()<K)
    {
        t1=pq.top();
        pq.pop();
        t2=pq.top();
        pq.pop();
        
        pq.push(t1+t2*2);
        answer++;
    }
    if(pq.top()<K)
        return -1;
    return answer;
}

모든 음식의 스코빌 지수가 높게 될 때까지 음식을 섞는다. 

이 때, 스코빌 지수가 가장낮은 두개를 계속 찾아야하기 때문에 자동으로 계속 정렬을 해주는 map이나 우선순위큐가 적당하다. 하지만 이 때, 첫 두개의 원소를 계속 빼야하기 때문에 map은 부적절하다. 따라서 우선순위큐를 이용해 구현한다. 

 

오름차순으로 정렬되는 우선순위큐에 원소를 다 대입한다.
만약 pq.top() 이 K보다 작으면 어쨋든 섞어야한다. 

따라서 그 조건일 때 두개를 빼서 섞기를 진행한다. 

 

while문을 빠져나오면 경우는 두가지다. pq.top()이 K보다 높아져서 중간에 종료됐던지 사이즈가 1이 돼서 종료됐던지
pq.top()이 K보다 크면 answer를 리턴하고 작으면 사이즈가 1이될때까지 스코빌지수 K 를 못넘겼기 때문에 -1을 리턴한다.