Lv 4. 무지의 먹방 라이브
https://school.programmers.co.kr/learn/courses/30/lessons/42891
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📌 자바(Java)로 푸는 무지의 먹방 라이브 문제 - 프로그래머스 🍜⏱
🔎 문제 개요
프로그래머스 Lv.4 - 무지의 먹방 라이브 문제는
무지가 각 음식의 걸리는 시간만큼 음식을 순서대로 먹고,
k초 후에 몇 번째 음식을 먹고 있어야 하는지를 구하는 문제입니다.
단, **음식 순서는 원형(끝나면 처음으로)**이고,
시간이 부족하면 -1을 반환해야 합니다.
💡 예제 입력
food_times = [3, 1, 2]
k = 5
💡 예제 출력
1
➡ 무지는 0~5초 동안 음식을 먹고, 6초일 때 1번 음식을 먹고 있는 상태
🛠 알고리즘 접근 방식
이 문제를 단순히 시간마다 시뮬레이션하면 O(k)이므로 시간 초과 발생.
따라서 우선순위 큐 또는 정렬 기반 최적화가 필요합니다.
✏️ 핵심 아이디어
- 전체 음식 시간을 기준으로 레벨 단위로 먹어치움
- 시간 차이 × 남은 음식 수를 통해 k에서 빼기
- k를 넘기면, 남은 음식들을 번호순으로 정렬하여 k % 남은 수를 인덱스로 반환
🔹 Java 코드 해설
class Node {
int number;
int times;
public Node(int number, int times){
this.number = number;
this.times = times;
}
}
✔ 음식 번호와 남은 시간 정보를 담는 클래스
Arrays.sort(foods, (a, b) -> {
if (a.times == b.times) return a.number - b.number;
return a.times - b.times;
});
✔ 음식들을 남은 시간 기준 오름차순으로 정렬
✔ 적은 시간부터 순차적으로 처리하기 위함
long timeDiff = foods[i].times - prevTime;
long spend = timeDiff * (n - i);
✔ 현재 레벨(timeDiff)의 음식들을 한번에 처리할 수 있는지 계산
✔ 처리 가능하면 k에서 뺌, 아니면 break
if (i == n) return -1;
✔ 모든 음식을 다 먹었다면 -1 반환
remaining.sort(Comparator.comparingInt(a -> a.number));
return remaining.get((int)(k % remaining.size())).number;
✔ 남은 음식들 중에서 번호 순 정렬
✔ k % 남은 수 위치에 있는 음식이 정답
🔍 예제 시각화
food_times = [3, 1, 2], k = 5
- 처음 정렬: [(2,1), (3,2), (1,3)]
- 레벨 1 제거 → 남은 시간: [2,1]
- 다음 레벨 차이: 1 × 2 = 2 → k=2
- 남은 음식: 1번(2초), 3번(1초) → 번호 순: [1,3]
- k=2 → 2 % 2 = 0 → 정답: 1
🏆 정리
✅ 핵심 포인트
✔ 시간 단위가 아닌 시간 레벨별로 한번에 계산
✔ 남은 음식 수를 고려해 k를 빠르게 줄여나감
✔ 마지막에는 번호 순 정렬로 정답 도출
이 글이 도움이 되셨다면 좋아요와 공유 부탁드립니다! 😊