알고리즘/프로그래머스 고득점 Kit

프로그래머스 Lv.2) 기능 개발 (Stack&QUEUE)

Zin0_0 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;
    }
    
}
반응형