문제 원문
문제 파악
1. 각 기능은 100%때 배포됨 -> 배포 날짜는 잔여 기간과 스피드에 따라 결정됨.
2. 배포 날짜를 나열했을 때, 뒷 요소가 앞 요소보다 작을 경우 앞 요소보다 빨리 배포되지 않고 앞 요소가 배포될때 함께 배포됨. -> 앞 요소(기준) ~ 앞 요소보다 작거나 같은 요소들까지 함께 배포됨.
3. 각 날짜마다 배포되는 개수를 배열에 저장하여 반환하라.
코드 적용
function solution(progresses, speeds) {
let days = []; // 배포 날짜를 저장할 배열
let result = []; // 최종 결과
let count = 0; // 같은 날짜에 배포되는 기능의 수(result의 요소)
// 잔여 진도와 속도로 배포 날짜 구하기
progresses.forEach((v,i) => {
const day = Math.ceil((100-v)/speeds[i]); // Math.ceil 함수로 실수 반올림(JS 특성)
days.push(day); // 각 날짜를 days에 추가
})
let pivot = days[0]; // days의 첫 요소를 기준으로 삼음
days.forEach((v,i) => {
// 기준 이하일 시, 같은 날짜에 배포되므로 횟수 증가
if(pivot >= v) count++;
// 기준 초과일 시, 누적된 횟수를 result에 push 한 후 횟수를 초기화
else {
result.push(count);
count = 0;
// 이제 이 요소가 다음 기준이 된다
pivot = v;
if(pivot >= v) count++;
}
// days의 끝에 도달했을 때, 마지막으로 횟수를 push 하고 반복문을 종료
if (i === days.length - 1) {
result.push(count);
}
})
return result;
}
제일 좋아요 많은 답(다른 사람 거)
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;
}
TIL
코딩 자체를 너무 오랜만에 해서 자바스크립트 배열 함수 다 까먹고 초반에 엄청 헤맸다...
코테 왤케 어려움
1. JS의 특성상, 실수의 사칙연산 및 대소비교는 오류가 심하다. 날짜의 경우, Math.ceil(반올림 함수)을 사용하여 오류를 막는 것이 좋다.
2. 문제를 빠르게 파악하고 적절한 자료구조+알고리즘으로 단순화 시키는 것이 중요. 문제 잘못 이해하면 망한다...
3. 자료구조, 알고리즘을 먼저 복습해야 하려나? 일단 2번 + 오류 최적화 정도 해보고..
4. 아 그리고 반복문 스코프 엄청 중요하다 손으로 알고리즘 쓴 다음에 코드 짜야됨
'코딩 > 코테' 카테고리의 다른 글
[프로그래머스] 올바른 괄호 (스택/큐) (0) | 2023.09.04 |
---|---|
[구름] 합격자 찾기 (0) | 2023.04.06 |
[자바스크립트] 두 날짜 사이의 일수 구하기 (0) | 2022.06.17 |
[자바스크립트] 각 자릿수의 합으로 홀수 짝수 구별하기 (0) | 2022.06.03 |
[자바스크립트] 배열 속 부메랑 패턴의 개수 구하기 (0) | 2022.06.01 |