카펫 (level2)

원용현·2022년 9월 12일
0

프로그래머스

목록 보기
15/49

링크

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

문제

중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫에서 노란색과 갈색의 갯수를 알 때, 해당 카펫의 가로 세로 크기를 배열에 담아 반환하라. (가로 > 세로)

예제로 이해

갈색이 10개, 노란색이 2개일 때, 만들어지는 카펫의 모양은 다음과 같다.

따라서 해당 카펫과 같은 [4, 3]을 반환한다.

이 문제에서 가장 중요한 것은 갈색과 노란색의 갯수가 주어졌을 때, 해당 카펫이 가질 수 있는 가로, 세로를 먼저 알아내야한다. 예를 들어 위의 카펫은 전체 크기가 12이므로 [12, 1], [6, 2], [4, 3]의 크기를 가지는 카펫을 가질 수 있다. 여기에서 문제 특성상 갈색이 노란색을 감싸야하므로 카펫의 세로 크기는 3 이상만 올 수 있음을 알아야한다.

가로, 세로 크기의 집합을 모두 구했으면 다음으로는 주어진 가로, 세로에 대해서 식을 통해 갈색의 수와 노란색의 수를 계산한다. 갈색은 테두리에만 위치하며, 노란색은 테두리를 제외한 안쪽에만 위치함을 알면 식을 만들 수 있다.

갈색 = 가로 x 2 + (세로 - 2) x 2
노란색 = (가로 - 2) x (세로 - 2)

해당 식을 만족하는 가로, 세로를 만들어 반환하면 문제를 해결할 수 있다.

코드

function solution(brown, yellow) {
    let pair = []
    let size = brown + yellow
    let answer = []
    
    for(let i = 3; i <= Math.sqrt(size); i++) {
        if(size % i === 0) pair.push([size / i, i])
    }
    
    pair.forEach(el => {
        if((el[0] * 2 + (el[1] - 2) * 2)  === brown &&
            (el[0] - 2) * (el[1] - 2) === yellow ) {
            answer = el
        }
    })
    
    return answer
}

코드 풀이

먼저 만들어 질 수 있는 가로, 세로의 쌍을 구한다. 반복문을 실행하는데 반복문은 주어진 갈색, 노란색의 합의 제곱근까지만 반복문을 진행한다. 반복문의 내부에는 나머지 연산의 결과가 0이 되는 숫자를 구하는 조건문을 넣어 가로, 세로의 쌍을 구한다.

구한 값을 가지고 다시 반복문을 진행한다. 반복문의 내부에 조건문을 달아주는데 조건식은 위에서 설명한 가로, 세로의 값으로 갈색의 수와 노란색의 수를 구하는 식을 넣어준다. 해당 조건식을 만족하는 가로, 세로의 쌍을 최종 반환할 수 있도록 한다.

0개의 댓글