알고리즘/자료구조

[프로그래머스] 더 맵게 (Java, Heap, lv2)

leejinwoo1126 2024. 7. 19. 11:35
반응형

 


문제 출처 

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

 

프로그래머스

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

programmers.co.kr

 

문제 풀이

모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 스코빌 지수 가장 적은 두 가지 음식을 섞어 새로운 음식을 만든다 


섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)

 

- K 이상 음식을 만들 수 있는 최소 턴 수 (만약 모두 섞었는데 못 구하는 경우 -1 리턴) 

- 우선 순위 큐, PriorityQueue 사용 (오름차순) , 시간 복잡도 O(NlogN) 이때 N은 스코빌 지수 배열 크기

- scoville 배열의 길이는 2 ~ 1,000,000

 

요약

while 루프를 돌면서 카운트를 증가 시킨다

- 큐의 크기가 2 미만인 경우 더 이상 음식을 만들 수 없으므로 -1을 반환한다

- 큐의 peek() 값이 K 이상이면 정상 종료한다

- 이외 주어진 공식에 따라 신규 음식을 큐에 추가하여 반복문을 수행한다 

 

 

전체 코드

import java.util.*;
class Solution {
    public int solution(int[] scoville, int K) {
        Queue<Integer> que = new PriorityQueue<>(); // 오름차순
        for(int s : scoville) {
            que.add(s);
        }
        
        int answer = 0;
        while(true) {
            if(que.peek() >= K) break; // peek 값이 K이상이면 나머지도 K이상 만족
            if(que.size() < 2) return -1; // 음식이 하나면 더 이상 섞을 수 없다
            
            answer += 1;
            int v1 = que.poll();
            int v2 = que.poll();
            
            int next = v1 + (2 * v2);
            que.add(next);
        }
        
        return answer;
    }
}

 

 

 

반응형