https://school.programmers.co.kr/learn/courses/30/lessons/42586#
첫번째 풀이 (실패)
- progresses, speeds를 순회하여 각 기능마다 더 필요한 시간을 계산한다 Math.ceil( ( 100-progress ) / speeds );
- 필요한 시간 배열을 앞에서부터 순회하며 뒤에 더 많은 시간이 필요할때까지 앞의 시간안에 처리할 수 있는 기능의 합을 구한다
function solution(progresses, speeds) {
var answer = [];
const days = [];
for (let i = 0; i < progresses.length; i++) {
days.push(Math.ceil((100-progresses[i])/speeds[i])); // ceil
}
let queue = [];
for (const day of days) {
if (!queue.length) {
queue.push(day);
continue;
}
// 전보다 현재가 작거나 같으면
if (queue[queue.length-1] >= day) {
queue.push(day);
} else {
answer.push(queue.length);
queue = [day]; //
}
}
return [...answer, queue.length]; // queue에 남은 것 넣어주기
}
반례
progresses = [90, 98, 97, 96, 98] , speeds = [1, 1, 1, 1, 1] 일때 답은 [5]
queue의 마지막과 다음의 크기를 비교하는게 아니라 queue에서 가장 큰 수와 다음을 비교
두번째 풀이 (성공)
전보다 많은 시간을 비교하는 로직에서 바로 전의 시간과 비교하는게 아니라 전 까지 중 최대 시간과 비교한다
function solution(progresses, speeds) {
var answer = [];
const days = [];
for (let i = 0; i < progresses.length; i++) {
days.push(Math.ceil((100-progresses[i])/speeds[i])); // ceil
}
let queue = [];
let prevMax = 0;
for (const day of days) {
if (!queue.length) {
queue.push(day);
prevMax = day;
continue;
}
// 바로 전과 비교하는게 아니라 전까지 최대를 비교
if (prevMax >= day) {
queue.push(day);
} else {
prevMax = day;
answer.push(queue.length);
queue = [day]; //
}
}
return [...answer, queue.length]; // queue에 남은 것 넣어주기
}
'알고리즘' 카테고리의 다른 글
[우선순위큐] 프로세스 (앞에서 빼고 뒤에 넣고) (0) | 2023.10.12 |
---|---|
[프로그래머스] 다리를 지나는 트럭 JS (큐) (0) | 2023.10.12 |
[순서 확인 shift] 스킬트리 (0) | 2023.10.11 |
[프로그래머스 lv2] 두 큐 합 같게 만들기 (0) | 2023.10.10 |
[프로그래머스] 디펜스 게임 (0) | 2023.10.10 |