반갑습니다!

[프로그래머스] 더 맵게 본문

알고리즘 문제 풀이

[프로그래머스] 더 맵게

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

풀이

이 문제는 Heap 자료구조를 사용하면 쉽게 해결할 수 있다. Min-Heap으로 스코빌 지수가 가장 작은 두 개의 음식을 계속해서 섞어주면 쉽게 해결할 수 있다. 이 때 첫 번째 음식의 스코빌 지수가 K 이상인 경우 정답이다. 이 때, 모든 음식을 다 섞어서 1개만 남았는데도 스코빌 지수를 못넘는 경우 -1을 출력해주면 된다.

코드

C++

#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]);

    while(pq.size() > 1){ // 음식 1개가 될 때까지 섞기
        if(pq.top() >= k) break; // 가장 낮은 스코빌 지수가 K 이상인 경우

        int a = pq.top();
        pq.pop();
        int b = pq.top();
        pq.pop();
        pq.push(a + 2 * b);
        answer++;
    }
    if(pq.top() < k) return -1; // 음식이 1개이고 스코빌 지수가 K 미만인 경우
    return answer;
}

Java

import java.util.PriorityQueue;

class Solution {
    public int solution(int[] scoville, int K) {
        int answer = 0;
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for (int i : scoville) pq.add(i);
        while (pq.size() > 1) { // 음식 1개가 될 때까지 섞기
            if(pq.peek() >= K) break; // 가장 낮은 스코빌 지수가 K 이상인 경우
            int a = pq.poll(), b = pq.poll();
            pq.add(a + 2 * b);
            answer++;
        }
        if (pq.peek() < K) return -1; // 음식이 1개이고 스코빌 지수가 K 미만인 경우
        return answer;
    }
}