Notice
                              
                          
                        
                          
                          
                            Recent Posts
                            
                        
                          
                          
                            Recent Comments
                            
                        
                          
                          
                            Link
                            
                        
                    | 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 | 
                            Tags
                            
                        
                          
                          - 이분탐색
 - 알고리즘
 - 완전탐색
 - 프로그래머스
 - 플로이드-와샬
 - 위상정렬
 - 구현
 - 백준
 - Network
 - 에라토스테네스의 체
 - 동적계획법
 - 그리디
 - 문자열
 - 백트래킹
 - 유니온 파인드
 - Effective Java
 - 세그먼트 트리
 - Kotlin
 - 수학
 - JUnit 5
 - swea
 - CS
 - dfs
 - BFS
 - java
 - mst
 - 후니의 쉽게 쓴 시스코 네트워킹
 - 시뮬레이션
 - 투 포인터
 - 스택
 
                            Archives
                            
                        
                    반갑습니다!
[프로그래머스] 더 맵게 본문
풀이
이 문제는 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;
    }
}'알고리즘 문제 풀이' 카테고리의 다른 글
| [프로그래머스] 다트 게임 (0) | 2020.09.08 | 
|---|---|
| [프로그래머스] 가장 큰 수 (0) | 2020.09.07 | 
| [프로그래머스] 베스트앨범 (0) | 2020.09.06 | 
| [프로그래머스] 위장 (0) | 2020.09.06 | 
| [프로그래머스] 완주하지 못한 선수 (0) | 2020.09.06 |