프로그래머스 Lv.2) 기능 개발 (Stack&QUEUE)
기능 개발
코딩테스트 연습 - 기능개발
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 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;
}
}