https://school.programmers.co.kr/learn/courses/30/lessons/161989
function solution(n, m, section) {
let cnt = 0, lastPaint = section[0] - 1;
section.forEach((v)=>{
if (v > lastPaint) {
cnt++;
lastPaint = v + m - 1;
}
})
return cnt;
}
이중 반복문을 사용해도 통과는 되지만, 너무 오래 걸려 올바른 방법이 아니라고 생각했다.
대신, 이미 칠한 영역
보다 다음 칠해야 할 영역
이 크면 다음 칠해야 할 영역 + m - 1
로 lastPaint
값을 재할당했다. 예를 들어, n = 8, m = 4, section = [2, 3, 6]
이 주어졌다면, 전체 영역은 다음처럼 나온다.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
O | X | X | O | O | x | O | O |
lastPaint
초깃값은 section[0] - 1 = 1
이며, 이 다음 영역 2
에서 페인트 칠을 시작해야 한다. 페인트 칠이 가능한 영역은 2, 3, 4, 5
까지로, 다음 lastPaint
는 5
가 된다(v + m - 1
). 3
은 앞서 칠해졌으므로, 6
을 판단한다. lastPaint
보다 크므로 cnt
를 늘린다. lastPaint
가 바뀌지만, 반복문이 끝나 cnt
를 반환한다.