> 문제
2019 카카오 겨울 인턴십 문제
문제 : [무지의 먹방 라이브]
> 문제풀이
풀이 핵심은 마지막까지 회전하고, 나머지 값을 인덱스로 음식을 찾아 리턴해주었다.
0 <= k-(m*n) < n 식은 나머지 값을 찾기 위해 회전수를 구하는 식으로,
0 <= k - m(회전수)*n(음식수) = 나머지 < n(음식수),
(k-n)/n < m(회전수) <= k/n에서 m(회전수)의 최댓값을 도축하여 회전하였다.
이때 음식의 크기가 회전수보다 작을 수 있기 때문에, 마이너스(-)된 만큼 k에 추가해주었다.
k값이 남은 음식수보다 작아질때까지 반복하며, 나머지 값을 음식리스트 인덱스로 뽑아냈다.
import java.util.*;
class Solution {
public int solution(int[] food_times, long k) {
long m = 0;
List<Pos> list = new ArrayList<>();
for(int i=0; i<food_times.length; i++){
list.add(new Pos(i+1, food_times[i]));
}
long n = 0;
while(k >= list.size()){ // k값이 음식수보다 작아질때까지, 즉 회전할 수 없을때까지 동작.
n = list.size();
if(list.isEmpty()) return -1; // k초 후에 음식 리스트가 없으면 -1 리턴.
for(long i = (k-n)/n; i<= k/n; i++){ // 0 <= k-(m*n) < n 식을 세웠다.
m = i; // n는 총 푸드갯수, m은 회전 수
} // 즉 회전할 수 있는 최댓값을 구하는 식이다.
k = k - m*list.size();
for(int i=0; i<list.size(); i++){
list.get(i).cnt -= m; // 회전한 만큼 음식 크기를 줄여주며,
if(list.get(i).cnt <= 0){ // 음식 크기가 0 또는 음수라면,
k = k - (list.get(i).cnt); // -값만큼 k값을 채워주고,
list.remove(i); // 음식 리스트에서 제외해준다.
i--;
}
}
} // k가 리스트의 갯수보다 작아지면, k번째 음식을 출력한다.
return list.get((int)k).n;
}
static class Pos{
int n, cnt;
public Pos(int n, int cnt){
this.n = n;
this.cnt = cnt;
}
}
}
문제 출처 : Programmers
PREVIOUS[프로그래머스]Level3 - 순위