https://programmers.co.kr/learn/courses/30/lessons/42586
sol1
function solution(progresses, speeds) {
let day = Array.from({length:speeds.length},()=>0);
for(let i=0;i<speeds.length;i++) {
while(progresses[i]<100) {
progresses[i] +=speeds[i];
day[i]++;
}
}
let answer = [];
let max = day[0];
let count = 1;
for(let i =1;i<day.length;i++){
if(day[i]<=max) {
count++;
} else {
max = day[i];
answer.push(count);
count = 1;
}
}
answer.push(count);
return answer;
}
1.
첫 번째 for문에서 100% 완성까지 걸리는 날짜를 담은 day 배열을 만들어 준다. for문에 있는 while에서 progresses [i]<=100으로 조건을 주면 답안 제출 시 11번 케이스만 틀렸다고 나온다. 진도와 속도 모두 자연수인데 어느 케이스에서 day 배열이 안 맞게 되는지는 알지 못했다..
// 첫번째 입력의 day 배열
[7,3,9]
//두번째 입력의 day 배열
[5,10,1,1,20,1]
2.
두 번째 for문에서 1시간 동안 헤맸던 부분은 return 위의 answer.push() 부분이다. 이 부분 없이 출력하면 return 되는 값에 마지막 요소가 없이 나온다.
// 만약 마지막 라인에서 answer.push() 를 하지 않는다면
//1번 입력의 경우 [2, 1] 이 나와야 하지만
[2]
//2번 입력의 경우 [1, 3, 2] 이 나와야 하지만
[1, 3]
//각각 마지막 요소가 빠진채로 return 된다.
else 부분을 보면 day 배열에서 탐색 중인 요소보다 다음 요소가 클 경우에만 answer 배열에 넘겨준다. 즉, 배열의 마지막에서 현재 요소보다 더 큰 값을 만나지 않기 때문에 count는 쌓아두지만 answer 배열에 넘어가지는 않는다. count가 초기화된 건 아니므로 for문 밖에서 마지막으로 count를 푸시해주면 된다. 내가 짠 로직인데도 흐름을 놓쳐서 다 만들어놓고 한참 시간을 허비했다.. 항상 조건을 잘 파악하고 배열의 마지막까지 돌아가는지 확인하자.
sol2
let days = progresses.map((progress, index) => Math.ceil((100 - progress) / speeds[index]));
//[7,3,9]
//[5,10,1,1,20,1]
sol1에서 만들었던 day 배열은 이렇게도 만들 수 있다. 제일 처음 고려했던 계산이긴 했는데 소수를 올려주는 메서드가 기억이 안 나서:(
floor를 사용하는 빈도가 더 높다 보니 놓치고 있었던 것 같다.
'Study > Algorithm' 카테고리의 다른 글
[programmers / JavaScript] 큰 수 만들기 (0) | 2022.06.25 |
---|---|
[BEAKJOON / node.js] 17298 오큰수 (0) | 2022.06.25 |
[BEAKJOON / node.js] 1302 베스트셀러 (0) | 2022.06.21 |
[BEAKJOON / node.js] 1744 수 묶기 (0) | 2022.06.17 |
[BEAKJOON / node.js] 12904 A와 B (0) | 2022.06.16 |