ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 Lv.2) 기능 개발 (Stack&QUEUE)
    알고리즘/프로그래머스 고득점 Kit 2020. 6. 1. 18:14
    반응형

    기능 개발

     

    코딩테스트 연습 - 기능개발

    프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 ��

    programmers.co.kr

    풀이

    아침에 머리를 깨우기 위해 레벨 2부터 한 문제 풀고 시작하려고 문제를 봤는데, 새로운 문제가 없어서 풀었던 문제를 다시 풀었다.

    키자마자 예전에 짰던 코드를 지우고, 새롭게 코드를 짜보았다.

    전보다 더 효율적으로 코드를 짜서 행복했다 ㅎㅎㅎㅎ 

    하지만, 오늘 아침에 짠 코드보다 더 효율적인 코드가 있을 것이라고 생각한다.

     

    아무튼, 블로그에 올린 적이 없던 문제기 때문에 기억을 최대한 살려 설명하겠습니다.

     

    코드 1 = 처음 풀었을 때 코드

     

    개발을 진행해야하는 developing 큐와, 개발이 끝난 developed 큐를 만든다.

    progresses 배열을 돌며, 남은 개발일 수를 (남은 %와 speed에 따라 일 수를 구해) developing 큐에 저장한다.

    반복문을 통해 하루 씩 진행하며, 잔여 일수가 0이될 때 까지 개발 일정을 줄여나간다.

    맨 앞의 작업이 끝나면 뒤에 끝나있는 작업을 구해 카운트를 세주어 developed에 넣어주었다.

    반복문 이후에 저장된 developed 큐를 통해 배열의 크기를 할당하고, 답을 옮겨적는다.

     

     

    코드 2 = 다시 푼 코드

     

    LinkedLikst를 이용해 남은 일수를 담은 dayList와 답이 담길 ansList를 만들어 주었다.

    progresses 배열을 돌면서 남은 일수를 dayList에 저장해준다.

    여기까지는 똑같은 것 같다.

     

    다음 반목문을 통해 dayList가 남아있을 때까지 탐색하면서, Queue의 맨 위의 숫자보다 작은 숫자를 찾아 하나의 프로세스로 묶어주었다.

    Queue의 맨 위의 숫자를 standard로 정하고, standard보다 큰 숫자를 만날 때 까지 큐에서 순차적으로 제거하면서 카운트를 세줬다.

    중간에 nullException 방지를 위해 isEmpty를 사용해주었다.

     

    저장은 처음에 풀었던 것과 동일하게 해주었다.

     

     

     

     

    코드 1

     

    import java.util.Queue;
    import java.util.LinkedList;
    
    class Solution {
        public int[] solution(int[] progresses, int[] speeds) {
            int[] answer;
    
            Queue<Integer> developed = new LinkedList<>();
            Queue<Integer> developing = new LinkedList<>();
    
            // 남은 개발일정을 developing에 저장해주기
            for(int i=0; i< progresses.length; i++) {
                int deadLine = 100 - progresses[i]; // 남은 %를 먼저 구해주고
                deadLine = deadLine % speeds[i] != 0 ? deadLine/speeds[i] +1: deadLine/speeds[i];   // 남은 일자를 구해서 저장
                developing.add(deadLine);   // 개발 일정에 추가해주기
            }
    
            // 하루하루 시간을 체크해줄 while문
            while(!developing.isEmpty()) { //최대 걸리는 날짜가 100일이므로
                // 우선 작업 잔여 날짜를 줄여준다. (1day 부터 시작)
                for(int i=0; i<developing.size(); i++) {
                    ((LinkedList<Integer>) developing).set(i, ((LinkedList<Integer>) developing).get(i)-1);
                }
    
                if(developing.peek() <=0) {
                    int cnt =1;
                    developing.poll();
                    int size = developing.size();
                    for(int i=0; i< size; i++) {
                        if(((LinkedList<Integer>) developing).peek() <=0) {
                            cnt++;
                            developing.poll();
                        } else {
                            break;
                        }
                    }
                    developed.add(cnt);
                }
    
            }
    
            int size = developed.size();
            answer = new int[size];
    
            for(int i=0; i<size; i++) {
                answer[i] = developed.poll();
    //            System.out.println(answer[i]);
            }
    
            return answer;
        }
    }

     

    코드 2

     

    import java.util.LinkedList;
    
    class Solution {
        final int COMPLETE = 100;
        public int[] solution(int[] progresses, int[] speeds) {
            LinkedList<Integer> dayList = getDays(progresses, speeds);
            LinkedList<Integer> ansList = new LinkedList<>();
            
            while(!dayList.isEmpty()) {
                int standard = dayList.poll();
                int cnt =1;
                if(dayList.isEmpty()) {
                    ansList.offer(cnt);
                    break;
                }
                while(standard >= dayList.peek()) {
                    cnt++;
                    dayList.poll();
                    if(dayList.isEmpty()) {
                        break;
                    }
                }
                ansList.offer(cnt);
            }
            int[] answer = new int[ansList.size()];
            for(int i=0; i<answer.length; i++) {
                answer[i] = ansList.poll();
            }
            
            return answer;
        }
    
        private LinkedList<Integer> getDays(int[] progresses, int[] speeds) {
            LinkedList<Integer> result = new LinkedList<>();
            for(int i=0; i<speeds.length; i++) {
                int day = (COMPLETE -progresses[i])/speeds[i];
                if((COMPLETE-progresses[i])%speeds[i] !=0) {
                    day++;
                }
                result.offer(day);
            }
            return result;
        }
        
    }
    반응형

    댓글

Designed by Tistory.