🔗 문제 LINK
♟ 풀이 순서
- 각 작업에 걸리는 시간을 계산해 배열로 만든다. workingPeriod = []
(100% - 현 진행%)/작업속도 소수점올림 이 앞으로 걸리는 시간
- wokingPeriod를 forEach(period,index)로 돌면서
- max < period 이면 max = period를 해준다.
- forEach가장 마지막 배열일때, 다음배열이 max 보다 클때 num을 push 해주고 num을 초기화 해준다.
- 그 이외에는 num++ 를 해준다.
- ex) workingPeriod = [7,3,8]일 경우
- period = workingPeriod[0] = 7
num = 1, max = 7, answer = []
- period = workingPeriod[1] = 3
num = 2, max = 7, answer = [2]
다음으로오는 숫자가 3보다 큰 8이므로 answer에 num 값을 넣어준다.
- period = workingPeriod[2] = 8
num = 1, max = 8, answer = [2,1]
지금 8이 배열의 가장 마지막이므로 answer에 num 값을 넣어준다.
👾 코드
const solution = (progresses, speeds) => {
let answer = [];
let num = 1;
let max = 0;
let workingPeriod = progresses.map((day, index) =>
Math.ceil((100 - day) / speeds[index])
);
//ref
workingPeriod.forEach((period, index) => {
if (max < period) max = period;
if (workingPeriod.length - 1 === index || max < workingPeriod[index + 1]) {
answer.push(num);
num = 1;
} else {
num++;
}
});
return answer;
};
👀 코드 비교
- 다른 코드방법 중에서 내가 forEach문안에 쓴 if문을 훨씬 간단하게 한 방식이 눈에 띄었다.
이렇게 하면 anser에 직접 값을 넣어줌으로 num이라는 변수를 써주지 않아도 된다.
또 배열의 마지막일 경우에 대한 예외사항을 작성하지 않아도 되어서 좋았다.
for(let i = 0, j = 0; i< days.length; i++){
if(days[i] <= maxDay) {
answer[j] += 1;
} else {
maxDay = days[i];
answer[++j] = 1;
}
}
☕ 잡담
- 물론 다른 방법중에서 while문안에 for를 사용하는 방법이 있었지만 O(n^2)라서 위와같은 방법을 채택했다.
- forEach문안에서 if문을 어떻게 써야할지에대한 생각을 너무 오래했다.
조건사항에 대한 정리가 머리에서 잘 되지 않았다. 물론 연습장에 써보기도 하고 했는데 정리를 어떻게 해야 할지 감이 잡히지 않았다. 그렇게 많은 조건이 아닌 것 같은데 다음에도 또 이런 식으로 시간을 많이 쓸 것 같은데 연습하면 나아지는 건지를 잘 모르겠다.
Leave a comment