한 걸음씩

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

Programmers

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

winter17 2023. 7. 18. 09:55

https://school.programmers.co.kr/learn/courses/30/lessons/161989

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 과정

function solution(n, m, section) {
	// 길이가 n개인 배열을 생성하는데 요소를 true로 채우기
    const arr = Array.from({length:n}).fill(true)
    
    // section에 있는 요소들을 arr에서 false로 바꾸기
    for (let i = 0; i < section.length; i++){
        arr[section[i] - 1] = false
    }
    // arr배열을 반복할 때 false가 나오면 splice메서드로 m만큼 true로 바꿔주는데
    // 모두가 false가 나오지 않을 때까지 cnt에 횟수를 기록
    let cnt = 0
    for (let i = 0; i < arr.length; i++){
        if (arr[i] === false){
            arr.splice(i, m, true)
            cnt++
        }
    }
    return cnt;
}

마지막 반복문에서 splice 메서드를 사용하여 true로 바꿀 때 arr배열을 콘솔로 찍어서 확인해 보면 

원하는 배열 모양이 안나와서 왜 그런지 봤더니 splice 메서드를 사용하는 부분에서 인덱스 i에서 m개를 삭제하고 true로 바꿔라는 코드를 작성했는데 m개만큼 true가 채워지는 게 아니라 삭제는 m개를 하지만, true를 채우는 건 한 번이기 때문에 배열의 길이를 보장을 하지 못한다. 

위의 코드로 통과는 됐지만 정확한 코드라고는 할 수 없다. 그래서 수정을 해보면 다음과 같다

 

function solution(n, m, section) {
    const arr = Array.from({length:n}).fill(true)
    for (let i = 0; i < section.length; i++){
        arr[section[i] - 1] = false
    }
    let cnt = 0
    for (let i = 0; i < arr.length; i++){
        if (arr[i] === false){
        	// 0부터 m - 1까지 반복을 해서
            for (let j = 0; j < m; j++) {
            // arr[i]부터 m - 1까지 true로 바꿔야하니까 i + j
                arr[i + j] = true; 
            }
            cnt++
        }
    }
    return cnt;
}

 


리뷰

splice메서드를 사용해도 문제 통과를 하지만 정확한 결과를 불러오진 못하기 때문에 적절한 선택은 아닌 것 같다.

두 번째 코드가 배열 길이를 그대로 유지하고 예시 결과를 불러오는 과정이 똑같기 때문에 더 적절한 코드!