본문 바로가기
algorithm/문제풀이

연습문제 > 덧칠하기

by yongfront 2024. 4. 19.
반응형
SMALL

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

 

프로그래머스

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

programmers.co.kr

처음에 이런식으로 접근 했다

// n : 6, m : 1, section : [1, 3, 5]
// answer : 3
// 반환 결과 : 5

롤러의 길이 m 이 1일 때는 다른 결과가 나오므로

if (m === 1) {
    return section.length;
}

를 추가했지만

60% 밖에 통과를 못했고

 

// 입력값 〉 5, 2, [1, 2, 5]

// 기댓값 〉 2

// 반환 결과 : 5

라는 반례를 찾아냄

 

결국 롤러의 길이만큼 section 의 배열을 짤라서 칠해지는지 여부를 파악해가면서 돌려야 함

 

이런 식으로 2차원 배열로 추가하게 끔 해서 2차원 배열의 length를 리턴하는 식으로 해결하려고 했는데

이거보다 더 간단하게 푸는 방법이 떠오름 (사실은 엄청난 삽질을 통해...)

 

 

function solution(n, m, section) {
    let arr = [];
    
    for (let i = 0; i < section.length; i++) {
        if (i === 0) arr.push([section[i]]);
        const currentArr = arr[i];
        const lastArr = currentArr[currentArr.length - 1];
        let width = 1;
        let j = i + 1;

        const nextSection = section[j];
        while (width <= m && nextSection !== undefined) {
            width += section[j] - lastArr;
            if (width <= m) currentArr.push(nextSection);
            console.log(width, nextSection, lastArr, currentArr);
        }

        if (nextSection !== undefined) {
            arr.push([nextSection]);
        }
        console.log(arr);

    }

}

 

이런식으로

처음 i === 0 일 때 시작지점에 최초의 2차원 배열 arr[i] 를 추가하면

[ [2] ] 이 되고

여기서 section 의 다음 index인 3, 6을 조건에 맞게 롤러의 길이만큼만 추가하는 식으로

 

롤러의 길이를 width += section[j] - lastArr; 식으로 계산해서 m(롤러 길이)가 넘어가면

다음 2차원 배열이 추가되도록 해보려고 했지만

while 문이 index랑 얽혀서 꼬여버림

 

최종 정답...

function solution(n, m, section) {
    let arr = [];  // 결과를 저장할 2차원 배열
    let i = 0;     // section 배열의 인덱스

    while (i < section.length) {
        let coveredSections = [section[i]]; // 현재 롤러로 시작하는 섹션을 추가
        let lastArr = section[i];           // 마지막으로 칠한 구역을 기록
        let width = 1;                      // 현재 롤러로 칠할 수 있는 너비 초기화
        let j = i + 1;                      // 다음 섹션의 인덱스

        // 다음 섹션들을 검토하면서 롤러의 너비를 넘지 않는 범위 내에서 추가
        while (j < section.length && (section[j] - lastArr + width <= m)) {
            coveredSections.push(section[j]);
            width += section[j] - lastArr;  // 롤러의 현재 너비 업데이트
            lastArr = section[j];           // 마지막으로 칠한 구역 업데이트
            j++;
        }

        // 결과 배열에 현재 롤러로 커버된 섹션들의 배열 추가
        arr.push(coveredSections);
        i = j;  // 다음 롤러의 시작점으로 인덱스 업데이트
    }

    console.log(arr);
    return arr.length;
}

테스트 케이스까지 추가해서

 

통과

for 문 사용할 때 

function solution(n, m, section) {
    let arr = [];  // 결과를 저장할 2차원 배열

    for (let i = 0; i < section.length;) {
        let coveredSections = [section[i]]; // 현재 롤러로 시작하는 섹션을 추가
        let lastArr = section[i];           // 마지막으로 칠한 구역을 기록
        let width = 1;                      // 현재 롤러로 칠할 수 있는 너비 초기화
        let j = i + 1;                      // 다음 섹션의 인덱스

        // 다음 섹션들을 검토하면서 롤러의 너비를 넘지 않는 범위 내에서 추가
        while (j < section.length && (section[j] - lastArr + width <= m)) {
            coveredSections.push(section[j]);
            width += section[j] - lastArr;  // 롤러의 현재 너비 업데이트
            lastArr = section[j];           // 마지막으로 칠한 구역 업데이트
            j++;
        }

        // 결과 배열에 현재 롤러로 커버된 섹션들의 배열 추가
        arr.push(coveredSections);
        i = j;  // 다음 롤러의 시작점으로 인덱스 업데이트
    }

    console.log(arr);
    return arr.length;
}

 

728x90
반응형
LIST

'algorithm > 문제풀이' 카테고리의 다른 글

탐욕법(Greedy) > 체육복  (0) 2024.04.30
Summer/Winter Coding(~2018) > 소수 만들기  (0) 2024.04.24
해시 > 전화번호 목록  (1) 2024.04.10
해시 > 완주하지 못한 선수  (0) 2024.04.10
정렬 > H-Index  (1) 2024.04.03