(프로그래머스 42842) 카펫

ps  · 2 mins read

이해

  • 직사각형 카펫은 중앙에 노란색으로 칠해져 있고 테투리 1줄은 갈색으로 칠해져있고 가로 길이는 세로 길이와 같거나, 세로 길이보다 길다.
  • 갈색 격자의 수와 노란색 격자의 수가 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하라.

계획

  • 전체 격자 수를 구한 다음 세로 길이로 가능한 모든 값에 대해서 탐색한다(완전 탐색).
  • 전체 격자 수를 세로 길이로 나눈 값을 가로 길이로 설정해준다.
  • 2 * 가로 길이 + 2 * (세로 길이 - 2)의 값이 만들어지는 카펫의 테두리 1줄의 격자 수이다.
  • 전체 격자 수에서 테두리 1줄의 격자 수를 뺀 값이 만들어지는 카펫의 중앙 격자 수이다.
  • 주어진 갈색 격자 수와 노란색 격자 수를 새로 만든 카펫의 테두리 1줄의 격자 수와 중앙 격자 수와 비교한다.

실행

import math

def solution(brown, yellow):
    total = brown + yellow
    for h in range(3, math.floor(math.sqrt(total)) + 1):
        if total % h != 0:
            continue
        w = total // h

        brown_num = 2 * w + 2 * (h - 2)
        yello_num = total - brown_num

        if brown_num == brown and yello_num == yellow:
            return [w, h]

개선

  • O(sqrt(N + M)) -> O(1)로 풀 수 있다.
# brown = 2 * w + 2 * (h - 2)
# yello = (w - 2) * (h - 2)
# 이차 방정식을 세워서 근을 구해준다.
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]

회고

  • 쉬웠고, 먼저 계획을 세운 후에 코딩을 하니까 확실히 에러가 덜 나는 것 같다.
  • 완전 탐색으로 접근한 코드가 훨씬 가독성이 좋다.