상세 컨텐츠

본문 제목

[JS] 덧칠하기 - 프로그래머스

프로그래밍 및 언어/코딩 테스트 문제

by 남민우_ 2024. 11. 27. 21:22

본문

문제

 

제한 사항

 

예시

 

풀이

문제가 길어서 읽는데 시간이 좀 걸렸다. 먼저 코드부터 살펴보자.

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, 벽의 길이를 넘어가지 않도록 했다.

 

실행 결과

관련글 더보기