문제주소 :programmers.co.kr/learn/courses/30/lessons/42891#
코딩테스트 연습 - 무지의 먹방 라이브
programmers.co.kr
<문제 설명>
문제 설명
무지의 먹방 라이브
* 효율성 테스트에 부분 점수가 있는 문제입니다.
평소 식욕이 왕성한 무지는 자신의 재능을 뽐내고 싶어 졌고 고민 끝에 카카오 TV 라이브로 방송을 하기로 마음먹었다.
![](https://blog.kakaocdn.net/dn/sIkEo/btq1xm80jrE/tZILNk7WVdXPVAKs6oev80/img.png)
그냥 먹방을 하면 다른 방송과 차별성이 없기 때문에 무지는 아래와 같이 독특한 방식을 생각해냈다.
회전판에 먹어야 할 N 개의 음식이 있다.
각 음식에는 1부터 N 까지 번호가 붙어있으며, 각 음식을 섭취하는데 일정 시간이 소요된다.
무지는 다음과 같은 방법으로 음식을 섭취한다.
- 무지는 1번 음식부터 먹기 시작하며, 회전판은 번호가 증가하는 순서대로 음식을 무지 앞으로 가져다 놓는다.
- 마지막 번호의 음식을 섭취한 후에는 회전판에 의해 다시 1번 음식이 무지 앞으로 온다.
- 무지는 음식 하나를 1초 동안 섭취한 후 남은 음식은 그대로 두고, 다음 음식을 섭취한다.
- 다음 음식이란, 아직 남은 음식 중 다음으로 섭취해야 할 가장 가까운 번호의 음식을 말한다.
- 회전판이 다음 음식을 무지 앞으로 가져오는데 걸리는 시간은 없다고 가정한다.
무지가 먹방을 시작한 지 K 초 후에 네트워크 장애로 인해 방송이 잠시 중단되었다.
무지는 네트워크 정상화 후 다시 방송을 이어갈 때, 몇 번 음식부터 섭취해야 하는지를 알고자 한다.
각 음식을 모두 먹는데 필요한 시간이 담겨있는 배열 food_times, 네트워크 장애가 발생한 시간 K 초가 매개변수로 주어질 때 몇 번 음식부터 다시 섭취하면 되는지 return 하도록 solution 함수를 완성하라.
제한사항
- food_times 는 각 음식을 모두 먹는데 필요한 시간이 음식의 번호 순서대로 들어있는 배열이다.
- k 는 방송이 중단된 시간을 나타낸다.
- 만약 더 섭취해야 할 음식이 없다면 -1을 반환하면 된다.
정확성 테스트 제한 사항
- food_times 의 길이는 1 이상 2,000 이하이다.
- food_times 의 원소는 1 이상 1,000 이하의 자연수이다.
- k는 1 이상 2,000,000 이하의 자연수이다.
효율성 테스트 제한 사항
- food_times 의 길이는 1 이상 200,000 이하이다.
- food_times 의 원소는 1 이상 100,000,000 이하의 자연수이다.
- k는 1 이상 2 x 10^13 이하의 자연수이다.
입출력 예
food_times k result[3, 1, 2] | 5 | 1 |
입출력 예 설명
입출력 예 #1
- 0~1초 동안에 1번 음식을 섭취한다. 남은 시간은 [2,1,2] 이다.
- 1~2초 동안 2번 음식을 섭취한다. 남은 시간은 [2,0,2] 이다.
- 2~3초 동안 3번 음식을 섭취한다. 남은 시간은 [2,0,1] 이다.
- 3~4초 동안 1번 음식을 섭취한다. 남은 시간은 [1,0,1] 이다.
- 4~5초 동안 (2번 음식은 다 먹었으므로) 3번 음식을 섭취한다. 남은 시간은 [1,0,0] 이다.
- 5초에서 네트워크 장애가 발생했다. 1번 음식을 섭취해야 할 때 중단되었으므로, 장애 복구 후에 1번 음식부터 다시 먹기 시작하면 된다.
<풀이법>
▒ 한줄 개념: 구현 ▒
이틀정도 걸렸고, 다른 블로그의 도움을 받았다. 풀이방식은 아래와 같다.
1. 각 음식에 대해 idx, time 값을 가진 Food 객체 리스트(arr_food) 생성.
2. time 값에 따라 arr_food 정렬.
3. arr_food를 탐색하며 k값 줄여나감.
3-a. cost = (현재 음식의 소요시간 - 이전 음식의 소요시간) * 남아있는 음식의 개수
3-b. 현재 k값이 cost보다 크거나 같으면 k -= cost / prev_time 갱신
3-c. 현재 k값이 cost보다 작으면, 해당하는 위치를 찾아야함.
3-d. arr_food의 남아있는 부분들을 idx를 기준으로 정렬
3-e. 해당하는 위치를 return
4. arr_food를 모두 탐색해도 답이 나오지 않으면 (k값이 모든 time 값의 합보다 크면) return -1;
<코드(Java)>
import java.util.*;
class Solution {
class Food implements Comparable<Food>{
int idx;
int time;
public Food(int idx, int time){
this.idx = idx;
this.time = time;
}
@Override
public int compareTo(Food aFood){
return this.time - aFood.time;
}
}
List<Food> arr_food;
public int solution(int[] food_times, long k) {
arr_food = new LinkedList<>();
int n = food_times.length;
for(int i = 0; i < food_times.length; i++){
arr_food.add(new Food(i+1, food_times[i]));
}
Collections.sort(arr_food);
int prev_time = 0;
int i = 0;
for(Food f : arr_food){
long dif = f.time - prev_time;
if(dif != 0){
long cost = dif * n;
if(cost <= k){
k -= cost;
prev_time = f.time;
}else{
break;
k %= n;
arr_food.subList(i, food_times.length).sort((Food a, Food b) ->{
return a.idx - b.idx;
});
return arr_food.get(i+(int)k).idx;
}
}
i++;
n--;
}
return -1;
}
}
더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest
'Programmers' 카테고리의 다른 글
[프로그래머스] 동굴 탐험 / Java (0) | 2021.04.01 |
---|---|
[프로그래머스] 블록 게임 / Java (0) | 2021.03.31 |
[프로그래머스] 보행자 천국 / Java (0) | 2021.03.29 |
[프로그래머스] 스티커 모으기(2) / Java (0) | 2021.03.24 |
[프로그래머스] 카드 짝 맞추기 / Java (2) | 2021.03.24 |