-
프로그래머스 Lv.2) 기능 개발 (Stack&QUEUE)알고리즘/프로그래머스 고득점 Kit 2020. 6. 1. 18:14반응형
기능 개발
풀이
아침에 머리를 깨우기 위해 레벨 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; } }
반응형'알고리즘 > 프로그래머스 고득점 Kit' 카테고리의 다른 글
프로그래머스 Lv.2) 큰 수 만들기 (Greedy) (0) 2020.06.03 프로그래머스 Lv.2) 주식가격 (Stack & Queue) (0) 2020.06.02 알고리즘) 프로그래머스 Graph, 사이클 제거 (0) 2020.05.01 알고리즘) 프로그래머스 Graph, 순위 (0) 2020.04.27 알고리즘) 프로그래머스 Graph, 가장 먼 노드 (0) 2020.04.25