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

최유나·2024년 8월 21일
0

프로그래머스

목록 보기
47/53

✨ 덧칠하기

나의 풀이

function solution(n, m, sections) {
    let answer = 0; // 페인트 칠을 해야하는 횟수 변수(최종 반환 값)
    let painted = 0; // 현재까지 칠해진 마지막 위치를 나타태는 변수
    for(section of sections){ // sections의 배열의 요소(section). 페인트 칠이 필요한 구간 
        if(painted < section){ // 현재까지 칠해진 마지막 위치가 section보다 작을 떄
            answer++; // 페인트 칠을 해야하는 횟수를 늘림
            painted = section + m - 1; // 페인트 칠한 후, section을 + m 미터만큼 칠한 후, 1을 빼면 현재 칠해진 위치 
        }
    }
    return answer;
}

n : 페인트칠을 해야 하는 전체 구간의 길이
m : 한 번에 페인트칠할 수 있는 연속된 구간의 길이
sections : 페인트칠이 필요한 특정 구간의 시작점들을 담은 배열

answer : 페인트 칠을 해야하는 횟수 변수(최종 반환 값)
painted : 현재까지 칠해진 마지막 위치를 나타태는 변수

for..of 문으로 배열인 sections를 반복하여 section으로 페인트 칠이 필요한 구간의 시작점을 나타낸다. n= 8, m = 4고 칠해지지 않은 구간이 2,3,6이라면 칠해지지 않은 구간[2,3,6]을 알기 위해 반복을 돌리는 것.
그 후, 조건문 을 통해 현재 칠해진 마지막 위치가 현재 구간의 시작점(section)보다 작은지 확인한 다음, 이게 참이라면 현재 구간은 페인트 칠이 덜 됬으므로 페인트 칠의 횟수 answer를 한 번 늘린다.

painted = section + m - 1 요 부분은 페인트 칠을 한 마지막 위치를 갱신 하는 것인데 만약 1,2,3,4,5,6,7,8만큼의 구간이 있는 벽(sections)에서 2부터 시작하여 4미터 만큼 페인트 칠을 하려고 하면 처음에는 6 만큼의 길이(m)가 칠해질 것이다. 그러면 이때 길이는 5length가 된다.
2부터 시작하여 3,4,5,6을 칠했으니까. 거기에 -1을 하여야 2부터 시작해서 4칸을 칠할 수 있는 길이를 가지게 된다.(페인트 칠의 시작점이 포함 되어있기 때문에 정확하게 계산하기 위해 쓰인다) 이게 마지막 위치가 되는 것이고 이 값을 통해 다음 구간이 칠해졌는지 확인 할 수 있다.

다른사람의 풀이

forEach문을 활용한 케이스

function solution(n, m, section) {
    let count = 0;
    const arr = Array.from(Array(n+1).fill(null));

    section.forEach(el =>{
        arr[el] = 1;
    })

    section.forEach(el=>{
        if(arr[el]){
            arr.fill(null, el, el+m)
            count++
        }
    })
    return count
}

0개의 댓글

관련 채용 정보