|
| 1 | +# [2019 KAKAO BLIND RECRUITMENT] 무지의 먹방 |
| 2 | + |
| 3 | +## 분류 |
| 4 | +> 정렬 |
| 5 | +> |
| 6 | +> 시뮬레이션 |
| 7 | +
|
| 8 | +## 코드 |
| 9 | +```java |
| 10 | +import java.util.ArrayList; |
| 11 | +import java.util.Collections; |
| 12 | +import java.util.Comparator; |
| 13 | + |
| 14 | +public class Solution { |
| 15 | + |
| 16 | + Comparator<Food> sortByIdx = new Comparator<Food>() { |
| 17 | + @Override |
| 18 | + public int compare(Food o1, Food o2) { |
| 19 | + return o1.idx - o2.idx; |
| 20 | + } |
| 21 | + }; |
| 22 | + |
| 23 | + Comparator<Food> sortByTime = new Comparator<Food>() { |
| 24 | + @Override |
| 25 | + public int compare(Food o1, Food o2) { |
| 26 | + return o1.time - o2.time; |
| 27 | + } |
| 28 | + }; |
| 29 | + |
| 30 | + public int solution(int[] food_times, long k) { |
| 31 | + int answer = -1; |
| 32 | + |
| 33 | + int idx = 1; |
| 34 | + ArrayList<Food> foods = new ArrayList<>(); |
| 35 | + for(int i=0; i<food_times.length; i++) |
| 36 | + foods.add(new Food(idx++, food_times[i])); |
| 37 | + |
| 38 | + // 먹는 시간순으로 정렬 |
| 39 | + Collections.sort(foods, sortByTime); |
| 40 | + |
| 41 | + long size = foods.size(); |
| 42 | + long prev = 0; |
| 43 | + for(int i=0; i<foods.size(); i++, size--){ |
| 44 | + Food food = foods.get(i); |
| 45 | + long sec = food.time - prev; |
| 46 | + long curTime = sec * size; |
| 47 | + prev = food.time; |
| 48 | + |
| 49 | + if(curTime <= k) |
| 50 | + k -= curTime; |
| 51 | + else{ |
| 52 | + k %= size; |
| 53 | + foods.subList(i, foods.size()).sort(sortByIdx); |
| 54 | + answer = foods.get(i + (int)k).idx; |
| 55 | + break; |
| 56 | + } |
| 57 | + } |
| 58 | + |
| 59 | + return answer; |
| 60 | + } |
| 61 | + |
| 62 | + static class Food{ |
| 63 | + int idx; |
| 64 | + int time; |
| 65 | + |
| 66 | + public Food(int idx, int time) { |
| 67 | + this.idx = idx; |
| 68 | + this.time = time; |
| 69 | + } |
| 70 | + } |
| 71 | +} |
| 72 | +``` |
| 73 | + |
| 74 | +## 문제 풀이 |
| 75 | +이전 코드랑 다른겨 없습니다! 정렬해서 푸는 방법이 생각날까 말까 하다가 너무 시간을 끄는거 같아서 카카오 해설보고 해결했습니다.(나중에 풀어볼 문제 추가!) |
| 76 | + |
| 77 | +먼저 먹는 시간 순으로 음식들을 오름차순 정렬합니다. |
| 78 | + - 오름차순으로 정렬하면 음식을 먹는데 시간을 한 번에 해결이 가능합니다. |
| 79 | + |
| 80 | +한 번에 해결이 가능하다는 것은 예를 들어, 3개의 음식이 있고 각각 먹는데 걸리는 시간이 3(1), 2(2), 1(3)이라고 해보겠습니다. |
| 81 | + - 먼저 오름차순으로 정렬합니다! 그러면 1(3), 2(2), 3(1)으로 정렬이 됩니다. 괄호안에는 인덱스 번호입니다. |
| 82 | + - 3번 음식을 먹는데 걸리는 시간이 1초입니다. 즉, 1초니깐 전체를 한 번씩만 먹으면 3번은 다 먹을 수 있는 것입니다! |
| 83 | + - 그러니깐 1 * 3(음식 수)의 시간이 지나면 3번 음식은 다 먹었다는 것은 자명한 사실입니다. |
| 84 | + - 그러면 2번째 음식은 2초가 걸리지만, 이미 앞에서 1초가 걸리는 음식을 먹었기 때문에 2초가 걸리던 2번 음식은 1초가 걸리게 될 것입니다. |
| 85 | + - 이를 위해서 이전에 먹었던 음식의 시간인 1초를 2번째 음식을 먹는데 걸리는 시간에서 빼주면 되겠져! |
| 86 | + - 그러면 그 뺀 시간! 2 - 1 = 1초입니다. |
| 87 | + - 그러면 전체적으로 1초씩 지나면 2번 음식도 다 먹을 수 있습니다! |
| 88 | + - 전체 사이즈 * 1초 = 2 * 1 = 2이므로 2초가 지나면 2번 음식도 다 먹을 수 있습니다! |
| 89 | + - 전체 사이즈가 2인 이유는 이미 1초가 걸리던 3번 음식을 다 먹었기 때문에 포함시키지 않기 위해서 줄인 것입니다. |
| 90 | + |
| 91 | +그러면 왜 정렬을 해서 푸는지를 알 수 있게 되었습니다. |
| 92 | + |
| 93 | +이제 로직은 다음과 같습니다. |
| 94 | + |
| 95 | +1. i번째 음식을 먹기 위해 걸리는 시간 = (현재 음식을 먹는 시간 - 이전에 먹었던 음식들 중 먹는데 오래걸리는 시간) * 남은 음식의 수 |
| 96 | + - 이전에 먹었던 음식들 중 먹는데 오래걸리는 시간은 정렬되어 있으므로 바로 이전 음식을 먹는데 걸리는 시간이 됩니다. |
| 97 | + - 따로 구하지 않아도 돕니다. |
| 98 | + - 그리고 현재 음식을 먹는 시간은 다음 음식을 먹는 시간에서 빼줘야 하므로 이 값을 이전에 먹었던 음식들 중 먹는데 오래걸리는 시간에 저장하면 됩니다. |
| 99 | +1. 1번에서 현재 음식을 먹는데 걸리는 시간이 현재 남은 시간!(K)보다 작거나 같다면 충분히 그 음식을 다 먹을 수 있다는 것입니다. |
| 100 | + - i번째 음식을 먹기 위해 걸린 시간을 K에서 빼줘서 시간이 지났음을 표현합니다. |
| 101 | +1. 만약에 i번째 음식을 먹는데 걸리는 시간이 현재 남은 시간보다 크다면! |
| 102 | + - 지금까지 먹은 음식들은 모두 제외하고 남은 음식들의 번호에 따라 정렬을 합니다. |
| 103 | + - 왜냐하면 이전까지는 시간에 따라 다 먹을 수 있냐 없냐로 계산했다면, 이제는 남은 시간에 현재 음식을 다 먹을 수 없으므로 정확하게 |
| 104 | + - 몇 번 음식을 먹는지 알아내기 위해 번호에 따라 정렬한 것입니다. |
| 105 | + - 즉, 남은 시간이 2초이고, 남은 음식이 각각 {3, 4, 5}초가 남았다면 3초 * 3개(남은 음식의 수)= 9초이므로 2초만에 어떤 음식도 다 먹지 못하죠! |
| 106 | + - 그래서 K초가 흘렀을 때 어디에 위치해 있느냐만 구하면 정답을 알 수 있는 것입니다. |
| 107 | + - 번호에 따라 정렬했다면, 현재 남은 시간을 현재 남은 음식의 수로 나눴을 때 나머지번째에 있는 음식이 장애 복구 후 먹기 시작해야 할 음식이 됩니다. |
| 108 | +1. 전체를 다 먹을 수 있다면 3번으로 들어가는 일이 없기 때문에 answer는 -1에서 값이 변하지 않으므로 다 먹을 경우에 대한 답도 구할 수 있습니다. |
| 109 | + |
| 110 | +## 후기 |
| 111 | +와우 어려워유 |
0 commit comments