프로그래머스-기능개발
개요
이번 문제는 문제에 대한 내용만 잘 파악하면 코딩하는데 큰 어려움이 없는 문제였다. 문제는 간단하게 풀었지만 다른사람 풀이를 보던 와중에 좋은 접근법이 있어 정리하고자 한다.
문제 링크
분류
- Level 2
- 스택/큐
요점
- 작업진도가 100%일 때 출시될 수 있음.
- 배포는 하루에 한번만이며 하루의 끝에 이루어짐(배포 기준 체크 로직이 마지막)
- 뒤에 있는기능이 먼저 100%를 달성하였다 하여도 앞의 기능이 100%가 아니면 배포될 수 없음. 즉 순차적으로 100%가 되었는지 확인하여야 함.
어려웠던 부분
- 처음에 빠져나가는순간에 대기중인 트럭이 들어올 수 있는 부분을 생각하지 못하여 좀 헛갈렸음
코드(javascript)
function solution(progresses, speeds) {
var answer = [];
while (progresses.length > 0) {
//기능개발
for (let progressesCounter = 0; progressesCounter < progresses.length; progressesCounter++) {
let currentPro = progresses[progressesCounter];
let currentSpeeds = speeds[progressesCounter];
progresses[progressesCounter] = currentPro + currentSpeeds;
}
let compleJobCnt = 0;
//기능개발후 진행도 체크
while(progresses.length > 0){
if(progresses[0] >= 100){
progresses.shift();
speeds.shift();
compleJobCnt++;
} else {
break;
}
}
if (compleJobCnt > 0) {
answer.push(compleJobCnt);
}
}
return answer;
}
-
코드 설명 첫번째 for loop에서 speeds 배열를 참조하여 progresses 요소값을 증가시킨다.
-
두번째 중첩 while문에서 progresses 배열의 첫 번째 요소를 검사한다. 이때 계속 첫번째 요소만을 검사하는 이유는 문제 조건에서 첫 번째 작업이 100%를 달성하여야 출시가 가능하기 때문이다.
-
마지막 if 조건문에서 완료된 작업 수를 answer 배열에 추가한다.
더 좋은 다른 풀이 코드(javascript)
function solution(progresses, speeds) {
let answer = [0];
let days = progresses.map((progress, index) => Math.ceil((100 - progress) / speeds[index]));
let maxDay = days[0];
for(let i = 0, j = 0; i< days.length; i++){
if(days[i] <= maxDay) {
answer[j] += 1;
} else {
maxDay = days[i];
answer[++j] = 1;
}
}
return answer;
}
-
이 코드의 map 함수가 사용된 라인을 확인해보자. 해석하면..
-
각 작업이 100%를 달성하기위해 얼마의 일수가 필요한지를 계산하는 코드이다.
-
즉 남은 작업일수를 가지고 작업 완료를 판단하는것이다. 구지 while문을 두번씩이나 중접시키지 않아도 되고 좀더 깔끔한 코드로 작업이 가능한것이다.
Leave a comment