0) 문제 유형 파악: 탐색횟수 최대 2005000번 👉 완전 탐색 문제 (O(N)이나 최대 O(N*logN)의 시간복잡도를 가지는 탐색법으로 풀어야함)
1) 주어진 red로 2차원 리스트를 만드려면, red의 약수여야한다.
2) 약수중에 2개를 뽑아서 곱하고, 그 값이 red랑 같은 것만 필터링한다.
3) 필터링된 행렬들에 테두리를 둘러서 칸 개수가 brown과 같으면 다시 한번 필터링한다.
(sum(행, 열) + 2 ) * 2 == brown
4) 필터링 된 값에 큰 값이 앞으로, 작은 값이 뒤로 하는 리스트 형태로 리턴
return [큰값, 작은값]
from itertools import combinations
def solution(brown, red):
if red == 1:
return [3, 3]
divisor = [i for i in range(1, red+1) if red % i == 0 ]
red_matrix = list(filter(lambda x: x[0] * x[1] == red, combinations(divisor, 2)))
answer = list(filter(lambda x: (sum(x) + 2) * 2 == brown, red_matrix))[0]
x, y = answer
return [y+2, x+2]
1) 전체 칸 개수가 몇개의 행과 열로 이루어졌는지 알아내기 위해 탐색
col = 전체칸 // row
def solution(brown, red):
all_tile = brown + red
for row in range(all_tile, 2, -1):
if all_tile % row == 0:
col = all_tile // row
if red == (row-2) * (col-2):
return [row, col]