문제가 길어서 읽는데 시간이 좀 걸렸다. 먼저 코드부터 살펴보자.
function solution(n, m, section) {
let answer = 0;
let isfill = Array.from({ length: n }, (_, i) => !section.includes(i + 1));
for (let i = 0; i < n; i++) {
if (!isfill[i]) {
answer++;
for (let j = i; j < Math.min(i + m, n); j++) {
isfill[j] = true;
}
}
}
return answer;
}
이 문제를 보고 내가 풀이의 주요하게 본 항목은 칠해져 있는 부분과 칠해져 있지 않은 부분을 나누는 것이었고 이를 bool 배열을 통해 구현했고, let isfill 배열이 그것이다.
let isfill = Array.from({ length: n }, (_, i) => !section.includes(i + 1));
Arry.from 을 통해 배열을 만들어 isfill 에 할당하는 과정이다.
배열의 길이는 { length : n } 을 통해 매개변수로 입력받은 전체 벽의 길이 n 으로 정하고 콜백 함수를 통해 그 내부값을 정한다.
콜백 함수의 매개변수로 _ 와 i 가 들어가는데, 이 _ 는 JS만의 관례로 무시되는 값을 말하여 우리가 신경써야 할 것은 i 만 보면 된다. section 이 i + 1 값을 가지고 있는지 판별 후 가지고 있으면 true, 없으면 false 를 할당하는 과정이다. 여기서 i+1 로 정한 이유는 예시를 보면 section 의 배열 시작이 1부터 N 까지이다. 하지만 실제 배열의 인덱스를 0부터 시작이므로 +1 을 통해 값을 정확하게 비교하고자 하였다.
이후 반복문을 통해 덧칠하는 과정을 진행한다.
만약 isfill[i] 가 false 면, 즉 칠해야 하는 부분이면 횟수를 뜻하는 answer 를 ++ 시킨 후 롤러의 길이, m 까지 isfill 을 true 로 바꾸는 과정을 진행한다.
반복문의 조건으로 j < Math.min(i + m, n) 를 사용해 j의 범위가 n, 벽의 길이를 넘어가지 않도록 했다.
[C++] 연속 부분 수열 합의 개수 - 프로그래머스 (1) | 2024.12.23 |
---|---|
[C++] 달리기 경주 - 프로그래머스 (0) | 2024.12.10 |
[JS] 모의고사 - 프로그래머스 (0) | 2024.11.25 |
[JS] 2016년 - 프로그래머스 (0) | 2024.11.22 |
[JS] 명예의 전당(1) - 프로그래머스 (0) | 2024.11.21 |