개발_자 2024. 8. 14. 09:56

 

function solution(n, m, sections) {
    let answer = 0;
    let painted = 0;
    for(const section of sections) {
        if(painted < section) {
            answer++;
            painted = section + m - 1;
        }
    }
    return answer;
}

sections 배열의 각 `section`을 순회하면서 페인트가 필요한 구간의 시작 위치를 가져옵니다.

현재 `painted`(페인트가 칠해진 마지막 위치)가 `section`(현재 구간의 시작 위치)보다 작다면, 현재 구간은 페인트칠이 되어 있지 않은 상태입니다.

새로운 페인트칠이 필요하므로 `answer`를 증가시킵니다.

새로 페인트필을 시작하면 `section`에서 `m`길이만큼의 페인트가 칠해지므로, 페인트가 칠해진 구간의 끝을 `section + m -1`로 업데이트합니다.

 

n = 10 (벽의 길이) (이 값은 코드에서 사용되지 않음)

m = 3 (페인트의 길이)

sections = [1, 4, 6]

 

이 경우:

 

처음에는 painted = 0이므로 section = 1을 페인트칠. answer를 1로 증가시키고, painted를 1 + 3 - 1 = 3으로 업데이트.

다음 section = 4는 painted = 3보다 크므로, 새로운 페인트칠이 필요. answer를 2로 증가시키고, painted를 4 + 3 - 1 = 6으로 업데이트.

마지막으로 section = 6은 현재 painted = 6 범위 내에 있으므로, 추가 페인트칠이 필요하지 않음.

결과적으로, 최소 2번 페인트칠이 필요하다는 결과를 반환합니다.

 

 

다른 사람 풀이

function solution(n, m, section) {
    let answer = 0;
    for(let i=1; i<n+1; i++){
        if(section.includes(i)){
            answer += 1
            i = i +m-1
            continue;
        }
    }
    return answer;
}

 

function solution(n, m, section) {
  let answer = 0;

  // 현재까지 칠한 구역
  let part = 0;

  // section을 forEach() 메서드로 하나씩 확인한다.
  section.forEach((n) => {

    // 현재 구역이 현재까지 칠한 구역보다 크다면
    if (n > part) {

      // 구역을 칠해주고 현재까지 칠한 구역을 업데이트 시켜준다.
      part = n + m - 1;

      // 페인트를 칠했으니 1증가 시킨다.
      answer++;
    }
  });

  return answer;
}