더 맵게

하이솝·2026년 4월 28일

문제 설명

매운 것을 좋아하는 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 합니다.

입출력 예

문제 풀이

1차 실행 오류


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;
    }
}

2차 실행 오류


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;
    }
}

3차 실행 오류


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;
    }
}

AI 코드


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           // 키 기준 자동 오름차순 정렬

0개의 댓글