문제

[프로그래머스] 카펫 (LV. 2)

요약

  • 직사각형 모양의 카펫의 테두리는 갈색, 나머지 안쪽 부분은 노란색으로 칠해져있다.
  • 노란색과 갈색 크기가 주어지면, 가로, 세로 크기를 반환하자.
  • 가로 길이 >= 세로 길이

분류

  • 완전탐색

풀이

1. 내 풀이

  • 어떤 자연수가 두 자연수의 곱으로 이루어져 있다고 하자. 두 자연수를 구하기 위해서는, 어떤 자연수를 1부터 어떤 자연수의 제곱근까지로 차례로 나눠보면 된다. (자연수의 약수를 떠올려 보자.)


def solution(brown, yellow):
    root_num = int(yellow ** (1 / 2)) if yellow != 1 else 1

    for i in range(1, root_num + 1):
        if yellow % i == 0:
            if i * 2 + (yellow / i) * 2 + 4 == brown:
                return [(yellow / i) + 2, i + 2]

2. 수학 (근의 공식)

  • 가로 길이를 x, 세로 길이를 y라고 하자
  • 넓이 : xy = brown + yellow
  • 둘레 : 2(x-2) + 2y = brown

<식 정리>

  • y = (brown + yellow) / x (x != 0)
  • 2(x-2) + 2(brown+yellow) / x = brown
  • 2x^2 - (4 + brown)x + 2(brown + yellow) = 0
  • 짝수 공식으로 식 세운다.

import math
def solution(brown, yellow):
    w = ((brown+4)/2 + math.sqrt(((brown+4)/2)**2-4*(brown+yellow)))/2
    h = ((brown+4)/2 - math.sqrt(((brown+4)/2)**2-4*(brown+yellow)))/2
    return [w,h]