본문 바로가기

문돌이 존버/프로그래밍 스터디

(프로그래머스 완전탐색 문제 풀이) 카펫

반응형
문제 설명
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항
갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 예
brown               yellow                 return
10                       2                     [4, 3]
8                        1                      [3, 3]
24                      24                     [8, 6]
import math
def solution(brown, yellow):
    total = brown + yellow
    for i in range(1, int(math.sqrt(total)) + 1):
        if total % i == 0:
            if (total // i - 2) * (i - 2) >= yellow:
                return [total // i, i]

갈색 격자의 가로, 세로 길이가 될 수 있는 후보들을 먼저 생각했다. 예를 들어, 12면 (1, 12), (2, 6), (3, 4)와 같다. 그 뒤에는 반복되므로 제곱근을 통해 range를 정했다. 

노란색 격자의 후보는 위의 후보에 있는 가로, 세로 길이에서 각각 2를 빼주었고, 이때 크기가 노란색 격자보다 크다면 정답이라고 판단했다.  

# 모범 참고 코드
def solution(brown, yellow):
    for i in range(1, int(yellow**(1/2))+1):
        if yellow % i == 0:
            if 2*(i + yellow//i) == brown-4:
                return [yellow//i+2, i+2]

참고 코드랑 내가 푼 버전이랑 구체적인 방법에서 차이가 있지만, 전반적인 로직은 동일하다. 노란색 격자의 둘레를 이용하여, 갈색 격자가 노란색 격자를 포함하는 것이라면 답으로 출력하는 것이다. 갈색 격자는 안쪽 둘레를 이용한다.

728x90
반응형