문제 설명
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를 비교해 같은 것을 반환한다.
라는 방법으로 풀었다.
문제 링크
'프로그래밍 언어 > python' 카테고리의 다른 글
Python(1) - 파일 (0) | 2021.02.03 |
---|---|
파이썬을 배워야 하는 이유 (0) | 2021.01.10 |