처리조건
풀이
progresses에 각 작업 %가 들어간 배열이 들어온다. 이 배열은 맨앞에 작업이 100%가 되어야 뒤에 있는 작업들의 %을 검사할 것이고 100%가 된것들만 한번에 작업배열에서 나가게된다. 각 작업은 speeds에 있는 배열인덱스에 맞게 작업 %가 올라가게 될 것인데 먼저 progresses의 0번째 인덱스가 100이상인지 검사한다. 맞다면 이 작업은 무조건 일단 나간다. 그러므로 count를 ++ 하고 이제 뒤에 나갈수 있는 인덱스가 순서대로 100인지 검사한다. 1번째 작업부터 검사하므로 j와 j-1이 모두 100이상이어야 j는 나갈수 있다. 나가는 j는 count++를 해주고 해당 j 즉 인덱스를 endIndex에 기록한다. 왜냐? 내보낸 작업들을 progresses에서 짤라버리고 다시 while문을 돌려할 것이다.
만약에 0번째 인덱스가 100이 아니면 어차피 다 나갈 수 없으므로 speeds을 각 인덱스 별로 올려준다. while문을 여러차례 돌리는데 break되는 조건은 progresses에 있는 작업들이 하나도 없어야한다. 즉 길이가 0일 때 break한다.
여기서 주의할 점은 progresses에서 나갈수 있는 작업들은 나가고 나서 count에 올리고 splice로 해당 나간 요소들을 짤라낸다. 그럼 progresses의 길이도, 인덱스 순서도 바뀔것이다. else문의 for문에서 인덱스0이 100이상이 아닐때 speeds를 더하는 부분은 각 progresses와 speeds의 인덱스에 맞게 더해주고 있는데 우리는 splice를 통해 지금 progresses의 길이와 인덱스순서가 바꼈다. 그렇기에 splice를 speeds에서도 사용하여 사라진 작업을 제거해 주어야한다.
function solution(progresses, speeds) {
let result = [];
while (1) {
let count = 0;
let endIndex = 0;
if (progresses.length <= 0) {
break;
}
if (progresses[0] >= 100) {
count++;
for (let j = 1; j < progresses.length; j++) {
if (progresses[j] >= 100 && progresses[j - 1] >= 100) {
count++;
endIndex = j;
} else {
break;
}
}
result.push(count);
progresses.splice(0, endIndex + 1);
speeds.splice(0, endIndex + 1);
} else {
for (let i = 0; i < progresses.length; i++) {
progresses[i] = progresses[i] + speeds[i];
}
}
}
return result
}
'일반 학습 > 코딩 테스트' 카테고리의 다른 글
[프로그래머스] 가장 큰 수 (0) | 2022.03.17 |
---|---|
[프로그래머스] 프린터 (0) | 2022.03.16 |
[프로그래머스] 주차 요금 계산 (0) | 2022.03.14 |
[프로그래머스] k진수에서 소수 개수 구하기 (0) | 2022.03.12 |
[프로그래머스] n진수 게임 (0) | 2022.03.11 |
댓글