완전탐색 문제이다.
brown과 yellow 카펫의 갯수가 주어지고, 가로 세로 길이를 리턴하면 된다.
카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 길다는 조건이 있으므로
긴 부분은 무조건 가로라고 생각하고 문제를 풀었다.
import math
def solution(brown, yellow):
answer = []
temp=[]
for i in range(1,int(math.sqrt(yellow))+1):
if yellow%i==0:
temp.append([yellow//i,yellow//(yellow//i)])
for i in range(len(temp)):
if brown == (temp[i][0]*2)+(temp[i][1]*2)+4:
answer=[temp[i][0]+2,temp[i][1]+2]
return answer
반복문으로 yellow
를 1
에서부터 루트yellow+1
까지 돌며
temp
에 [yellow//i, yellow//(yellow//i)]
를 추가해준다.
이는 yellow 카펫의 갯수가 주어졌을 때, 가능한 가로,세로의 길이를 모두 구하는 과정이다.
범위를 루트yellow+1
로 한정시킨 이유는 길이가 긴 부분이 가로이기 때문에, 중복된 값을 피하기 위해서이다.
예를들어 yellow가 24일 경우 temp
에 [[24, 1], [12, 2], [8, 3], [6, 4]]
가 들어가게 된다.
yellow가 24일 경우 가로24x세로1, 가로12x세로2, 가로8x세로3, 가로6x세로4가 될 수 있다는 것이다.
temp안의 리스트중 진짜 yellow의 가로, 세로 길이를 찾아야 하는 과정이다.
temp
의 길이만큼 반복문을 돌며 brown
의 갯수를 구한다.
yellow
의 가로, 세로 길이를 알면 다음과 같은 방식으로 brown
의 갯수를 구할 수 있다.
이 값이 주어진 brown
의 갯수와 같다면, yellow
의 진짜 가로 세로 길이를 구할 수 있는 것이다.
정답은 카펫 전체의 가로, 세로 길이를 구하는 것이기 때문에
yellow의 가로 길이+2, yellow의 세로 길이+2를 return 해주면 된다.