[프로그래머스] 더 맵게

최지나·2023년 12월 20일
1

코딩테스트

목록 보기
105/154

문제

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.

섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.

제한 사항
scoville의 길이는 2 이상 1,000,000 이하입니다.
K는 0 이상 1,000,000,000 이하입니다.
scoville의 원소는 각각 0 이상 1,000,000 이하입니다.
모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.

입출력 예

scovilleKreturn
[1, 2, 3, 9, 10, 12]72

문제 출처

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

생각

  • scoville의 길이는 2 이상 1,000,000 이하이기 때문에 리스트를 사용하여 매번 정렬하는 것은 불가능,, 가장 덜 매운 음식 1, 2위를 계속 찾기 위해서 heap 자료구조가 좋아 보인다 => PriorityQueue 사용하자
  • 힙에 음식이 2개 이상 있고, 그 중 가장 덜 매운 음식이 K보다 스코빌 지수가 낮다면, 가장 덜 매운 음식 2개를 제거하고, 규칙에 맞는(계산한) 새로운 음식의 스코빌 지수를 힙에 삽입하자 => 이 행위 반복한 횟수 mixCnt를 세자
  • 반복문이 끝나도 스코빌 지수가 여전히 K 미만이라면 -1을 리턴하다

코드

import java.util.PriorityQueue;

class Solution {
    public int solution(int[] scoville, int K) {
        PriorityQueue<Integer> q = new PriorityQueue<>();
        for (int s : scoville){
            q.add(s);
        }
        int mixCnt = 0;
        while(q.size() >= 2 && q.peek() < K){
            q.add(q.poll() + q.poll() * 2);
            mixCnt++;
        }
        if (q.peek() < K) return -1;
        
        return mixCnt;
    }
}

다른 사람의 풀이

  • 대부분의 사람들이 힙 자료구조를 사용하여 이 문제를 풀었다!
  • 처음 코테할 때는 새로운 자료구조가 나올때마다 어렵기만 했는데 이제는 이렇게 명확하게 특정 자료구조를 사용하면 쉽게 풀 수 있는 문제는 오히려 좋다,, ! 🐥
profile
의견 나누는 것을 좋아합니다 ლ(・ヮ・ლ)

0개의 댓글