매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.
섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.

K 이상으로 만들 수 없는 경우 -1을 리턴하는 조건문을 추가했지만,
여전히 오류
실패, 런타임 오류, 실행 시간 초과
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;
class Solution {
public int solution(int[] scoville, int K) {
int answer = 0;
List<Integer> list = Arrays.stream(scoville).boxed().collect(Collectors.toCollection(ArrayList::new));
list.sort(null); // 오름차순 정렬
while(true) {
if (list.get(0) >= K) {
break;
}
int first = list.get(0);
list.remove(0);
int second = list.get(1);
list.remove(0);
int res = first + second * 2;
list.add(res);
list.sort(null);
answer++;
}
return answer;
}
}
second를 가져올 때 인덱스가 당겨진 상태라 0을 가져왔어야 하는데 1을 가져옴
실패, 런타임 오류, 실행 시간 초과
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;
class Solution {
public int solution(int[] scoville, int K) {
int answer = 0;
List<Integer> list = Arrays.stream(scoville).boxed().collect(Collectors.toCollection(ArrayList::new));
list.sort(null); // 오름차순 정렬
while(true) {
if (list.size() < 2 && list.get(0) < K) {
return -1;
}
if (list.get(0) >= K) {
break;
}
int first = list.get(0);
list.remove(0);
int second = list.get(1);
list.remove(0);
int res = first + second * 2;
list.add(res);
list.sort(null);
answer++;
}
return answer;
}
}
sort()로 인한 실행 시간 오류
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;
class Solution {
public int solution(int[] scoville, int K) {
int answer = 0;
List<Integer> list = Arrays.stream(scoville).boxed().collect(Collectors.toCollection(ArrayList::new));
list.sort(null); // 오름차순 정렬
while(true) {
if (list.size() < 2 && list.get(0) < K) {
return -1;
}
if (list.get(0) >= K) {
break;
}
int first = list.get(0);
list.remove(0);
int second = list.get(0);
list.remove(0);
int res = first + second * 2;
list.add(res);
list.sort(null);
answer++;
}
return answer;
}
}
PriorityQueue를 이용한 자동 정렬
import java.util.PriorityQueue;
class Solution {
public int solution(int[] scoville, int K) {
int answer = 0;
PriorityQueue<Integer> pq = new PriorityQueue<>();
for (int x : scoville) {
pq.add(x);
}
while (pq.peek() < K) {
if (pq.size() < 2) return -1;
int first = pq.poll();
int second = pq.poll();
pq.add(first + second * 2);
answer++;
}
return answer;
}
}
Collection (인터페이스)
├── List → 순서 O, 중복 O
│ ├── ArrayList // 동적 배열, 조회 빠름
│ ├── LinkedList // 연결 리스트, 삽입/삭제 빠름
│ └── Vector // ArrayList의 동기화 버전 (구식)
│
├── Set → 순서 X, 중복 X
│ ├── HashSet // 순서 없음, 가장 빠름
│ ├── LinkedHashSet // 삽입 순서 유지
│ └── TreeSet // 자동 오름차순 정렬
│
└── Queue → FIFO (선입선출)
├── LinkedList // 일반 큐
├── PriorityQueue // 우선순위 큐 (최소 힙)
└── ArrayDeque // 양방향 큐 (스택으로도 사용)
└──Deque (인터페이스)
├── ArrayDeque // ✅ 권장
└── LinkedList
Map (인터페이스) → Key-Value 쌍
├── HashMap // 순서 없음, 가장 빠름
├── LinkedHashMap // 삽입 순서 유지
└── TreeMap // 키 기준 자동 오름차순 정렬
