Skip to content

Commit 3a4560c

Browse files
committed
nsun9505 solved 무지의 먹방 라이브
1 parent d9d33e9 commit 3a4560c

File tree

2 files changed

+172
-0
lines changed

2 files changed

+172
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
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+
와우 어려워유
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import java.util.ArrayList;
2+
import java.util.Collections;
3+
import java.util.Comparator;
4+
5+
public class Solution {
6+
7+
Comparator<Food> sortByIdx = new Comparator<Food>() {
8+
@Override
9+
public int compare(Food o1, Food o2) {
10+
return o1.idx - o2.idx;
11+
}
12+
};
13+
14+
Comparator<Food> sortByTime = new Comparator<Food>() {
15+
@Override
16+
public int compare(Food o1, Food o2) {
17+
return o1.time - o2.time;
18+
}
19+
};
20+
21+
public int solution(int[] food_times, long k) {
22+
int answer = -1;
23+
24+
int idx = 1;
25+
ArrayList<Food> foods = new ArrayList<>();
26+
for(int i=0; i<food_times.length; i++)
27+
foods.add(new Food(idx++, food_times[i]));
28+
29+
Collections.sort(foods, sortByTime);
30+
31+
long size = foods.size();
32+
long prev = 0;
33+
for(int i=0; i<foods.size(); i++, size--){
34+
Food food = foods.get(i);
35+
long sec = food.time - prev;
36+
prev = sec;
37+
38+
long curTime = sec * size;
39+
if(curTime <= k)
40+
k -= curTime;
41+
else{
42+
k %= size;
43+
foods.subList(i, foods.size()).sort(sortByIdx);
44+
answer = foods.get(i + (int)k).idx;
45+
break;
46+
}
47+
}
48+
49+
return answer;
50+
}
51+
52+
static class Food{
53+
int idx;
54+
int time;
55+
56+
public Food(int idx, int time) {
57+
this.idx = idx;
58+
this.time = time;
59+
}
60+
}
61+
}

0 commit comments

Comments
 (0)