본문 바로가기
알고리즘/프로그래머스

[프로그래머스][자바스크립트][Level2] 카펫

by Benjamin_Choi 2022. 1. 3.

/**
 * 카펫 - 완전 탐색
 * https://programmers.co.kr/learn/courses/30/lessons/42842?language=javascript
 * 가로 >= 세로
 */

/** 1 */
function solution(brown, yellow) {
    const area = brown + yellow;

    for (let i = 1; i<=2501; i++) {
        for (let j =1; j<=2501; j++) {
            if (i*j === area && (2*i + 2*j - 4 === brown)) return [Math.max(i, j), Math.min(i, j)];
        }
    }
}

console.log(solution(10, 2));
console.log(solution(8, 1));
console.log(solution(24, 24));

첫번째 풀이는 2x가로 + 2x세로 - 4 = brown 인데, brown이 8이상 5000이하이므로 brown 을 최댓값 5000 으로 두고, 가로 세로에서 한 쪽의 최솟값을 2라고 두고 계산하면 다른 한 쪽의 최댓값은 2501 이 된다. 즉, 가로 세로가 2501 보다 클 수 없으므로, 2501 x 2501 의 이중 for 문으로 주어진 식을 계산하면 위와 같은 코드로 답을 얻을 수 있다. 하지만 범위가 넓어 시간이 오래걸린다.

 

/** 2 */
function solution(brown, yellow) {
    const w_plus_h = brown/2 + 2;

    for (let w=1; w<w_plus_h; w++) {
        const h = w_plus_h - w;
        if (w*h === (brown+yellow)) return [Math.max(w, h), Math.min(w, h)];
    }
}

console.log(solution(10, 2));
console.log(solution(8, 1));
console.log(solution(24, 24));

위에서 처음 푼 방법을 기반으로 가로 세로 각각의 최대 값을 구하는게 아니라, w + h 값을 구하고, 그 범위만큼 w와 h 를 구해서 그 범위 안에서만 for 문을 통해 답을 얻을 수 있다. 처음 해보다 훨씬 빠르다.

댓글