Algorithm & Data Structures/Programers

Lv 4. 무지의 먹방 라이브

Geisha 2025. 4. 8. 15:18

 

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

 

  1. 처음 정렬: [(2,1), (3,2), (1,3)]
  2. 레벨 1 제거 → 남은 시간: [2,1]
  3. 다음 레벨 차이: 1 × 2 = 2 → k=2
  4. 남은 음식: 1번(2초), 3번(1초) → 번호 순: [1,3]
  5. k=2 → 2 % 2 = 0 → 정답: 1

 


🏆 정리

✅ 핵심 포인트

 

✔ 시간 단위가 아닌 시간 레벨별로 한번에 계산

✔ 남은 음식 수를 고려해 k를 빠르게 줄여나감

✔ 마지막에는 번호 순 정렬로 정답 도출

 

이 글이 도움이 되셨다면 좋아요와 공유 부탁드립니다! 😊