코딩테스트/프로그래머스
[코딩테스트] Java 더 맵게
[dev] hiro
2024. 11. 11. 11:47
제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
Programmers 알고리즘 고득점 Kit입니다.
포인트
최솟값을 찾기 위해 정렬을 사용해도 되지만 가장 효율적인 자료 구조 Heap을 이용하여 스코빌 지수의 최솟값을 찾도록 코드를 구현하였습니다.
소스코드
import java.util.*;
class Solution {
public int solution(int[] scoville, int K) {
PriorityQueue<Integer> scovilles = new PriorityQueue<>();
for (int level: scoville) {
scovilles.add(level);
}
int mix = -1;
int ans = 0;
while (scovilles.peek() < K) {
if (scovilles.size() < 2) {
return -1;
}
int first = scovilles.poll();
int second = scovilles.poll();
mix = first + second * 2;
scovilles.add(mix);
ans++;
}
return ans;
}
}
코드 설명
- PriorityQueue<Integer> scovilles = new PriorityQueue<>();
스코빌 지수를 저장하는 Heap을 생성합니다. 해당 힙은 최소 힙으로 구현합니다. - 섞은 음식의 스코빌 지수
- while 루프는 큐의 최솟값(scovilles.peek())이 K 미만인 동안 반복됩니다.
- 이때 큐의 크기가 2 미만이 되면, 더 이상 결합할 수 없으므로 -1을 반환하여 목표를 달성할 수 없음을 나타냅니다.
- 최솟값 두 개를 꺼내어(poll() 메서드 사용) 결합하여 새로운 스코빌 지수(first + second * 2)를 계산합니다.
- 새로 만든 스코빌 지수를 큐에 다시 추가하고, 결합 횟수 ans를 증가시킵니다.
- 섞은 횟수를 반환합니다.