문제 설명

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

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

문제 풀이

import math

def solution(brown, yellow):
    answer = []
    
    # 모든 타일의 수 = 넓이
    tiles = brown + yellow
    temp = []
    # 모든 가로, 세로 값의 경우의 수를 구함
    for i in range(3, int(math.sqrt(tiles)) + 1):
        if tiles % i == 0:
            if i > tiles / i:
                temp.append([i, int(tiles / i)])
            else:
                temp.append([int(tiles / i), i])
    # 정답의 타일과 일치할 때를 찾아냄
    for w, h in temp:
        if w * 2 + (h - 2) * 2 == brown:
            answer = [w, h]
            break
    
    return answer

여기서 모든 타일의 수는 카펫의 넓이와 같다. 카펫은 직사각형이기 때문에 가로 x 세로로 넓이가 결정된다. 갈색 타일의 경우 테두리를 둘러 싸고 있는데 타일의 수가 (가로) * 2 + (세로 - 1) * 2이다. 따라서 이 풀이에서는

1. 리스트 temp에 총 가능한 (가로 길이, 세로 길이) 쌍을 집어넣는다. (나머지 연산을 통해 나머지가 0이 나올 경우, 큰 쪽을 가로, 작은 쪽을 세로로 만들어 집어넣어주었다.)

2. temp에 들어있는 것 중 brown(갈색 타일의 수)와 (가로) * 2 + (세로 - 1) * 2를 비교해 같은 것을 반환한다.

라는 방법으로 풀었다.

문제 링크

programmers.co.kr/learn/courses/30/lessons/42842

'프로그래밍 언어 > python' 카테고리의 다른 글

Python(1) - 파일  (0) 2021.02.03
파이썬을 배워야 하는 이유  (0) 2021.01.10

+ Recent posts