-
프로그래머스 : 더 맵게Solve Algorithms/Array, Heap, Stack, Queue 2020. 6. 15. 18:55728x90
출처 : programmers.co.kr/learn/courses/30/parts/12117
알고리즘 분류 : 힙
문제 설명
매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다.
모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.
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 합니다.
입출력 예
scoville K return [1, 2, 3, 9, 10, 12] 7 2
입출력 예 설명
첫 번째 시도 : 스코빌 지수가 1인 음식과 2인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
두 번째 시도 : 스코빌 지수가 3인 음식과 5인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
결과 : 모든 음식의 스코빌 지수가 7 이상이 되었고 이때 섞은 횟수는 2회입니다.
접근
- 새로운 지수를 만드는데에 필요한 수는 배열에서 가장 작은 수와 그 다음으로 작은 수이다.
- 따라서 배열을 항상 오름차순으로 정렬한다면, 접근하기 편리할 것이다.
- 이와 같은 이유로, PriortyQueue를 이용하였다.
- PriorityQueue를 이용하는 것과, Heap Class와 push(), pop() 함수를 구현하는 것 중, 무엇이 더 효율적인지를 생각해봐야겠다.
코드
123456789101112131415161718192021222324252627282930313233343536package programmers;import java.util.*;public class Heap_1 {public int solution(int[] scoville, int K) {int answer = 0;PriorityQueue<Integer> q = new PriorityQueue<Integer>();for (int i : scoville) {q.add(i);}int tmp = 0;while (true) {q.add(q.poll() + 2 * q.poll());tmp = q.peek();if (q.size() == 1 && tmp < K) {answer = -1;break;} else {if (tmp >= K) {answer++;break;} else {answer++;}}}return answer;}}cs 728x90'Solve Algorithms > Array, Heap, Stack, Queue' 카테고리의 다른 글
프로그래머스 : 문자열 내 마음대로 정렬하기 (0) 2020.10.21 프로그래머스 : 크레인 인형뽑기 게임 (0) 2020.06.26 프로그래머스 : 주식가격 (0) 2020.06.13 프로그래머스 : 쇠막대기 (0) 2020.06.13 프로그래머스 : 기능개발 (0) 2020.06.13