2026.3.31.
https://school.programmers.co.kr/learn/courses/30/lessons/42586
function solution(progresses, speeds) {
const answer = [];
const que = progresses.map((p, index) => {
const days = Math.ceil((100 - p) / (speeds[index]));
return days;
})
let count = 1;
let target = que[0];
for (let i = 1; i < que.length; i++) {
if (target < que[i]) {
// 배포 불가능한 경우
answer.push(count);
target = que[i];
count = 1;
} else {
// 배포 가능한 경우
count += 1;
}
}
answer.push(count);
return answer;
}
map 메서드 안에서 변수 선언 및 return 문 없이 화살표 함수로 구현하는 것 정도? 근데 days 라는 개념을 명확히 해두고 싶어서 일부러 변수를 썼어서 개선하지 않음.패스!
function solution(progresses, speeds) {
const answer = [];
const que = progresses.map((p, index) => {
const days = Math.ceil((100 - p) / (speeds[index]));
return days;
})
let count = 1;
for (let i = 0; i < que.length; i++) {
// console.log(que[i], que[i+1], que[i] < que[i+1]);
// ⚠️ que[i]와 que[i + 1]을 비교하게 작성함
if (i === que.length - 1 || que[i] < que[i + 1]) {
console.log(i, true)
answer.push(count);
count = 0; // ⚠️ count를 1이 아닌 0으로 초기화함
} else {
console.log(i, false)
count += 1;
}
}
return answer;
}
count를 1로 초기화하도록 수정하면 문제에서 제시된 예시 케이스는 모두 통과한다.첫번째 인자 7 => count = 1
두번째 인자 3 => 7과 비교 => 7보다 작다 => count = 2
세번째 인자 5 => 7과 비교 => 7보다 작다 => count = 3
첫번째 인자 5 => count = 1
두번째 인자 10 => 5와 비교 => 5보다 크다 => 5 먼저 나가: answer.push(count), 10을 새로운 비교 대상으로 저장, count 1로 초기화
세번째 인자 1 => 10과 비교 => 10보다 작다 => count = 2
네번째 인자 1 => 10과 비교 => 10보다 작다 => count = 3
다섯번째 인자 20 => 10과 비교 => 10보다 크다 => answer.push(count), 20을 새로운 비교 대상으로 저장, count 1로 초기화
여섯번째 인자 1 => 20과 비교 => 20보다 작다 => count = 2
더이상 인자가 없음 => answer.push(count), 종료!
function solution(progresses, speeds) {
const answer = [];
const que = progresses.map((p, index) => {
const days = Math.ceil((100 - p) / (speeds[index]));
return days;
})
let count = 1;
let target = que[0];
// ✅ target 초기값을 null로도 해봤는데, 그럴 필요가 없었다. 제일 첫 요소로 시작해서 큰 값으로 계속 바꿔주면 되는 것!
// ✅ 제일 첫 요소(i=0 케이스)는 target으로 할당, count 1로 초기화 외에 하는 게 없어서 반복문 루프를 돌릴 필요가 없었다
// 그래서 i = 1부터 시작하도록 변경
// < 연산자라서 length - 1까지가 아닌 것도 체크
for (let i = 1; i < que.length; i++) {
// ✅ 인접 요소가 아닌 특정 target 값과 비교
if (target < que[i]) {
// 배포 불가능한 경우
answer.push(count);
target = que[i]; // ✅ 새로운 값으로 업데이트
count = 1;
} else {
// 배포 가능한 경우
count += 1;
}
}
// ✅ 루프가 끝나면 그때까지 누적된 count도 answer 배열에 포함해야 함!
answer.push(count);
return answer;
}
Math.ceil()Math 메서드였지..깨닫기Math.ceilMath.roundMath.floorreturn answer 처리하면 마지막 그룹은 포함되지 않은 상태임을 기억할 것shift 메서드와 내가 잘 안 쓰는 while문을 사용한 풀이법을 적어둔다.function solution(progresses, speeds) {
const answer = [];
const que = progresses.map((p, index) => {
const days = Math.ceil((100 - p) / (speeds[index]));
return days;
})
while (que.length > 0) {
const target = que.shift();
let count = 1;
// target보다 작거나 같은 것들을 앞에서부터 꺼내기
while (que.length > 0 && que[0] <= target) {
que.shift();
count++;
}
answer.push(count);
}
return answer;
}
shift는 혹시 모를 버그에 대비해 거의 안쓰긴 했다. (예를 들어 같은 배열을 다른 곳에서도 쓰고 있는데 shift로 다 꺼내버리면 그 다음에 참조하는 곳에서 빈 배열을 보게 되니까)