힙을 이용해서 문제를 해결하는 문제
더 맵게
문제 설명
매운 것을 좋아하는 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 합니다.
입출력 예
scoville | K | return |
[1, 2, 3, 9, 10, 12] | 7 | 2 |
입출력 예 설명
- 스코빌 지수가 1인 음식과 2인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
새로운 음식의 스코빌 지수 = 1 + (2 * 2) = 5
가진 음식의 스코빌 지수 = [5, 3, 9, 10, 12] - 스코빌 지수가 3인 음식과 5인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
새로운 음식의 스코빌 지수 = 3 + (5 * 2) = 13
가진 음식의 스코빌 지수 = [13, 9, 10, 12]
모든 음식의 스코빌 지수가 7 이상이 되었고 이때 섞은 횟수는 2회입니다.
주어진 문제
class Solution {
public int solution(int[] scoville, int K) {
int answer = 0;
return answer;
}
}
나의 문제풀이
import java.util.*;
class Solution {
public int solution(int[] scoville, int K) {
int answer = 0;
Queue<Integer> list = new PriorityQueue<>();
for (int i : scoville) {
list.add(i);
}
while (list.size() > 1 && list.peek() < K) {
list.offer(list.poll() + list.poll() * 2);
answer++;
}
if (list.peek() < K) answer = -1;
return answer;
}
}
- 우선순위 큐를 생성한다.
- scoville배열의 값을 큐에 넣어준다. (들어가면서 자동으로 오름차순 정렬)
- 큐의 크기가 1보다 크고 큐의 가장 작은 수가 k보다 작을 동안 반복한다.
- 가장 작은 수와 그다음 작은수 * 2의 수를 큐에 넣어준다.
- 반복 횟수를 늘려준다.
- 큐의 남은 수가 k 보다 작은 경우 조건에 만족을 할 수 없으므로 -1을 리턴해준다.
List<Integer> list = new ArrayList<>();
for (int i : scoville) {
list.add(i);
}
Collections.sort(list);
while (list.size() > 1 && list.get(0) < K) {
list.add(list.size(), list.get(0) + (list.get(1) * 2));
list.remove(0);
list.remove(0);
Collections.sort(list);
answer++;
}
if (list.get(0) < K) answer = -1;
효율성 테스트 실패 코드
처음에는 우선순위 큐를 안사용하고 그냥 리스트를 이용해서 똑같은 방식으로 구현을 했었는데, 정확도 테스트에서는 오히려 그냥 리스트가 근소하게 처리속도가 빨랐는데, 효율성 테스트를 들어가면서 시간 초과로 인해 실패가 떴다. 아마 부하가 많아질 수 록 리스트를 추가하고 삭제를 하는 부분에서 부하를 받고 매 번 반복마다 정렬함수를 사용하기 때문에 이 부분에서 문제가 발생한 게 아닐까 싶다.
정렬을 한번 하고 끝나는 게 아니라 반복 처리마다 정렬을 해야 할 경우는 우선순위 큐를 활용하는 게 손쉽게 처리를 할 수 있을듯한다.
문제 출처 - https://school.programmers.co.kr/learn/courses/30/lessons/42626?language=java
'생각정리 > 코딩테스트' 카테고리의 다른 글
[JAVA][Level3]PROGRAMMERS 디스크 컨트롤러 (1) | 2023.12.08 |
---|---|
[JAVA][Level2]PROGRAMMERS 가장 큰 수 (1) | 2023.12.07 |
[JAVA][Level2]PROGRAMMERS 다리를 지나는 트럭 (1) | 2023.12.05 |
[JAVA][Level2]PROGRAMMERS JadenCase 문자열 만들기 (0) | 2023.09.12 |
[JAVA][Level1]PROGRAMMERS 공원 산책 (0) | 2023.09.08 |