알고리즘 문제풀이

[프로그래머스] 더 맵게 (C++)

SiO2whocode 2024. 10. 31. 13:22
728x90

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

Heap 힙 (우선순위 큐)

n개의 음식의 스코빌지수가 배열로 주어지고, 이 음식들의 최소 스코빌 지수가 K이상이 되도록 음식을 섞을 수 있다고 할 때, 최소 몇번 섞어야 하는지 반환하는 문제. (모든 음식을 섞어도 스코빌지수가 K를 넘지 않는다면 -1을 반환)

음식을 섞는 다는 것은, 섞인 음식의 스코빌 지수 = 최저스코빌지수 음식의 스코빌 지수 + 두번째로 스코빌지수가 최저인 음식의 스코빌 지수*2 이다. 

 

접근방법 

갱신되는 음식들의 스코빌지수를 담고 있으면서, 늘 정렬되어있는 자료구조가 필요하다. = 우선순위 큐 (오름차순)

그러면 top 두개를 빼서 그 둘을 섞은 후에 섞인 음식의 스코빌 지수를 다시 우선순위큐에 넣으면 된다.

이 과정을 음식들의 최저 스코빌 지수가 K 이상이 될 때까지 혹은 모든 음식을 섞어버려서 음식이 1개만 남았을 경우 까지 반복한다.

음식이 1개만 남았을 경우, 그 한개의 스코빌지수가 K 이상인지 아닌지는 반복문을 나와서 확인한 후에,

이상이면 반복횟수를 리턴하고, 미만이면 -1을 반환하면 된다.

그리고 음식이 2개이상 남았을 경우, 음식을 다 섞지 않아도 모든 음식의 스코빌지수가 K이상이 되었다는 의미이므로 반복횟수를 반환한다.

이때 반복횟수(answer)은 반복문에서 음식을 섞어서 다시 우선순위큐에 넣을 때마다 1씩 증가시킨다.

 

오답노트

priority_queue 오름차순 = <int, vector<int>, greater<int>>

priority_queue 내림차순 = <int, vector<int>, less<int>>

커스텀 -> cmp (struct cmp -> operator() 오버라이드)

 

그리고 반복문에서 pq에서 두개를 빼서쓰는데 이러러면 pq에 두개이상의 원소가 있다는걸 보장해줘야 하기 때문에

반복문 조건에 pq에 2개 이상의 원소가 있을 경우만 들어가도록 조건 추가해줘야함

 

소스코드

#include <string>
#include <vector>
#include <iostream>
#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]);
    }
    
    while(pq.top() < K && pq.size() >= 2){
        int least = pq.top();
        pq.pop();
        int sec_least = pq.top();
        pq.pop();
        
        int mixed = least + sec_least*2;
        pq.push(mixed);
        answer++;
    }
    
    if(pq.top() < K){
        return -1;
    }
    
    return answer;
}
728x90