본문 바로가기
프로그래밍/알고리즘 연습

(2018년)KAKAO BLIND RECRUITMENT - 무지의 먹방 라이브(틀림)

by mrvan 2019. 1. 30.

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/42891?language=java#


첫번째 방법

1. 알고리즘

 - 큐(FIFO)를 이용하여 맨 앞에 있는 food를 먹고 해당 값을 맨 뒤로 보냄

 - 만약 0이 됐다면 해당 index는 제거


2. 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.util.LinkedList;
 
class Solution {
        public int solution(int[] food_times, long k) {
        int answer = 0;
        int count = 0;
        LinkedList<Integer> key = new LinkedList<Integer>();
        LinkedList<Integer> value = new LinkedList<Integer>();
        for(int i=1;i<=food_times.length;i++){
            key.add(i);
            value.add(food_times[i-1]);
        }
        for(long i=0;i<k;i++){
            int tkey=0;
            int tvalue=0;
            if(key.size()!=0){
                tkey = key.get(0);
                tvalue = value.get(0);
            }
            if(key.size()!=0){
                key.remove();
                value.remove();
            }
            tvalue=tvalue-1;
            if(tvalue!=0){
                key.add(tkey);
                value.add(tvalue);
            }
            else{
                count++;  
            }
            if(count == food_times.length){
                break;
            }
        }
        if(count==food_times.length)
            answer=-1;
        else
            answer = key.get(0);
        return answer;
    }
}
cs


3. 구현 방식

1. 두개의 LinkedList를 생성(key와 value)


2. key 와 value에 순서대로 값을 삽입  

1
2
3
4
ex) food_times = {2,1,5}라면
   key = {1,2,3}
   value = {2,1,5}
이런식으로 key와 value값을 매칭시켜 삽입

cs


3. k초 만큼 for문 반복하며 value값 1씩 감소 시킨 후 list에 add

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ex) food_times = {2,1,5}라면
최초       key = {1,2,3}
         value = {2,1,5}
 
0s~1s      key = {2,3,1}
         value = {1,5,1}
//key = 2 value = 1에서 value=0으로 변경되었으니 해당 index 삭제
1s~2s      key = {3,1}
         value = {5,1}
 
2s~3s      key = {1,3}
         value = {1,4}
//key = 1 value = 1에서 value=0으로 변경되었으니 해당 index 삭제
3s~4s      key = {3}
         value = {4}
cs

ㄹ 
     4-1. 만약 k반복 전에 key.size()==0 이라면 answer = -1
     4-2. 그렇지 않다면(k번 반복 완료) answer = key.get(0)


4. 결과
    정확성 테스트 : 32/32
    효율성 테스트 : 0/8


5. 원인 분석
    (1) k번만큼 for문을 도는 것은 너무 비효율적이다.

6. 수정
    (1) 전체 food_times 값이 k보다 작거나 같으면 answer=-1을 리턴 (for문전에 실시)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.LinkedList;
 
class Solution {
        public int solution(int[] food_times, long k) {
        int answer = 0;
        int count = 0;
        long sum=0;
        LinkedList<Integer> key = new LinkedList<Integer>();
        LinkedList<Integer> value = new LinkedList<Integer>();
        for(int i=1;i<=food_times.length;i++){
            key.add(i);
            value.add(food_times[i-1]);
            sum = sum +food_times[i-1];
        }
        if(sum<=k){
            answer = -1;
            return answer;
        }
        for(long i=0;i<k;i++){
            int tkey=0;
            int tvalue=0;
            if(key.size()!=0){
                tkey = key.get(0);
                tvalue = value.get(0);
            }
            if(key.size()!=0){
                key.remove();
                value.remove();
            }
            tvalue=tvalue-1;
            if(tvalue!=0){
                key.add(tkey);
                value.add(tvalue);
            }
        }
            answer = key.get(0);
        return answer;
    }
}
cs