https://school.programmers.co.kr/learn/courses/30/lessons/42586?language=javascript
나의 풀이
슈도 코드
- progresses 돌려서 완료일까지 남은 날짜수 담은 goalQueue 배열 정의
- 현재 날짜 date 변수를 정의하고 answer에 넣게 될 complete 변수 정의
- goalQueue의 맨 앞에 있는 애 가져옴(goal)
- 해당 goal과 date 비교
- 만약 date가 goal보다 크거나 같으면 pop으로 goalQueue에서 비우고 배포 처리, complete 1 증가
- 위 3~5를 계속 반복. goal이 date보다 작게 나오면 반복 탈출
- 한번에 배포처리한 수 complete를 answer에 넣고 complete 0으로 초기화. date 1 증가
- 위 3~8을 goalQueue 빌 때까지 반복
풀이 코드
function solution(progresses, speeds) {
var answer = [];
//완료일까지 남은 날짜수 담은 배열
let goalQueue = progresses.map((prog, idx) => {
return Math.ceil((100 - prog) / speeds[idx], 10);
});
let date = 0; //경과된 시간
while (goalQueue.length > 0) {
let complete = 0;
while (true) {
console.log(goalQueue);
if (goalQueue.length <= 0) {
break;
}
const goal = goalQueue[0];
if (date >= goal) {
complete++;
goalQueue.shift();
} else {
break;
}
}
if (complete > 0) {
answer.push(complete);
}
date += 1;
}
return answer;
}
다른 사람의 풀이
내 풀이에 비해 가볍고 간단하게 푼 코드가 있어서 가져와 봤다.
슈도 코드
- progresses 반복문 돌려서 완료일까지 남은 날짜수 담은 days 배열 정의
- 목표 날짜수가 될 maxDay를 days의 첫 번째 원소로 정의
- days를 반복문 돌리면서 maxDay와 days의 현재 원소(days[i]) 비교
- 만약 maxDay가 days[i]보다 크다면 현재 인덱스의 answer 데이터 1 증가
- maxDay가 days[i]보다 작다면 maxDay를 days[i]로 초기화하고, answer의 인덱스를 한 칸 증가시켜서 1 담기
풀이 코드
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;
}
내 코드가 date를 하나하나 늘려 가며 반복문을 돌리는 다소 미련한 풀이라면, 다른 사람의 풀이 코드는 date가 목표 days와 일치하거나 뛰어넘는 시점만 반복하도록 하는 효율적인 풀이라고 볼 수 있겠다.
'공부 > 알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스 코딩테스트 연습] 베스트 앨범 JS (0) | 2023.06.12 |
---|---|
백준 2941 : 크로아티아 알파벳 js 풀이 (1) | 2023.06.11 |
백준 4344 : 평균은 넘겠지 js 풀이 (0) | 2023.06.11 |
백준 8958 : OX퀴즈 nodejs 풀이 (1) | 2023.06.11 |