[프로그래머스] Level4 - 무지의 먹방 라이브

 
by 박신종

> 문제

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