본문 바로가기

CS/알고리즘

[230412] 카펫

반응형

 

 

문제

 

 

풀이

첫 풀이

function solution(brown, yellow) {
    const sum = brown + yellow;
    
    const sqrt = Math.sqrt(sum);
    if(sum % 2 === 1 && sqrt === sum / sqrt) return [sqrt, sqrt];
    
    let min = 1 + sum;
    const answer = [];
    
    for(let i = 2; i <= yellow + 2; i++) {
        const pairSum = sum / i + i;
        if(sum % i === 0 && min > pairSum) {
            min = pairSum
            answer[0] = Math.max(sum/i, i);
            answer[1] = Math.min(sum/i, i);
        };
    }
    return answer;
}

테스트 4, 6, 7, 8 불통

질문하기에서 불통인 이유를 살펴보니 다음과 같은 이유였다.

 

프로그래머스

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

programmers.co.kr

(18, 6) 이 주어졌을 때 solution = [8, 3]이 나와야만 하는데,

코드에 의하면 [6, 4]가 나오게 된다.

하지만 [6, 4]는 (16, 8)의 답이다.

즉, 주어진 파라미터와 맞지 않는 문제가 발생한다.

 

이러한 같은 경우도 고려해야만 한다.

 

두 번째 풀이

총 면적은 다음 수식을 만족한다.

area = yellow + brown = height * width

그리고 brown, yellow는 각 수식을 만족한다.

yellow = (height - 2) * (width - 2)

그러면 brown은 다음 공식을 만족한다.

brown = area - yellow = area - (height - 2) * (width - 2)

따라서 width, height가 될 수 있는 조건들 중에서 해당 조건을 만족하는 width, height가 해답이 된다.

카펫의 가로 길이는 세로의 길이와 같거나, 세로 길이보다 길다고 했다.

따라서 세로의 길이는 최소 3, 최대 (yellow + 2)가 될 수 있다.

그러므로 for문은 이렇게 된다.

for (let height = 3; height <= yellow +2; height++)

for문 안에 들어갈 코드는 앞에서 이야기한 바와 같이, 조건이 만족하는지 보면 된다.

const width = area / height;
const yellowArea = (width - 2) * (height - 2);
const brownArea = area - yellowArea; 

// 조건을 만족하는 brownArea, yellowArea가 각각 brown, yellow와 동일하면 해답이므로 답을 반환함
if(brown === brownArea && yellow === yellowArea) return [width, height];

 

전체 코드

function solution(brown, yellow) { 
    const area = brown + yellow;
    
    for (let height = 3; height <= yellow + 2; height++) { 
        const width = area / height;
        const yellowArea = (width - 2) * (height - 2);
        const brownArea = area - yellowArea; 
        
        if(brown === brownArea && yellow === yellowArea) return [width, height];
    }
}

통과!

 

 

 

 

 

반응형

'CS > 알고리즘' 카테고리의 다른 글

[230414] 예상 대진표  (0) 2023.04.14
[230413] 크기가 작은 부분문자열  (0) 2023.04.13
[230411] 피보나치 수  (0) 2023.04.11
[230327] 구명보트: Greedy 알고리즘  (0) 2023.03.27
[230326] 짝지어 제거하기: stack  (0) 2023.03.26