일단 red, brown으로 만들어지는 모양은 십자가같은 건 아니고 직사각형이다.
가로, 세로 길이가 다양하게 나올 수 있는데 주어진 red, brown의 타일 수로 red 직사각형을 만들고 brown으로 그 테두리를 감쌀 수 있으면 되는 것이다.
red의 개수로 직사각형을 그리다보면 red를 만들 수 있는 공약수로 짝을 지어서 그릴 수 밖에 없다.
red가 9면 1 x 9, 3 x 3
27이면 1 x 27, 3 x 9
24면 1 x 24, 2 x 12, 3 x 8, 4 x 6
이런 식이다.
가로의 길이는 세로보다 같거나 크다.
red로 만들 수 있는 다양한 직사각형의 테두리에 brown의 개수를 다 써서 채우는 걸 찾으면 된다.
red의 공약수 짝으로부터 테두리에 쓰인 타일 수를 구하는 식은
red의 가로 x 2 + (red의 세로 + 2) x 2이다.
red로 만들어진 짝을 가지고 테두리 수를 하나하나 구해서 주어진 brown과 일치하는 지 판단하면 된다.
일치한다면 [red의 가로 + 2, red의 세로 + 2]를 반환하면 된다.
def get_cd(red):
cds = []
cd_dict = {}
for i in range(1, red+1):
if red % i == 0:
cds.append(i)
cds_len = len(cds)
for j in range(cds_len//2):
cd_dict[cds[cds_len - j - 1]] = cds[j]
if cds_len % 2 == 1:
cd_dict[cds[cds_len//2]] = cds[cds_len//2]
return cd_dict
def solution(brown, red):
cd_dict = get_cd(red)
for x, y in cd_dict.items():
if brown == x * 2 + (y + 2) * 2:
return [x + 2, y + 2]
테스트 케이스
print(solution(10, 2))
print(solution(8, 1))
print(solution(54, 24))
print(solution(24, 24))
print(solution(16, 9))
출처 https://programmers.co.kr/learn/courses/30/lessons/42842?language=python3
'알고리즘 문제' 카테고리의 다른 글
프로그래머스 입국심사 (0) | 2019.09.01 |
---|---|
프로그래머스 예산 (0) | 2019.08.31 |
프로그래머스 숫자 야구 (0) | 2019.08.30 |
프로그래머스 소수 찾기 (0) | 2019.08.29 |
프로그래머스 모의고사 (0) | 2019.08.29 |