문제 이해하는데 15분 걸렸다. 직접 몇 개 그려보고 이해했다.
왜이렇게 지문이 길어...
일단 가로 * 세로가 총 블럭 개수랑 동일해야 하기 때문에 나누어 떨어지는 것들만 체크해서 가능성이 있는 크기의 카펫을 먼저 구한 뒤,
테두리를 채워 나가면서 남은 내부의 노란 타일이 일치할 경우 내가 찾는 조건이겠구나~ 했다.
int(변수)
로 하면 된다고 합니다~ (c랑 동일)def calculate(n,m):
return (n + m) * 2 - 4
def check(horizontal, vertical, brown, yellow):
cnt = 0
total_brown = 0
while total_brown < brown :
total_brown = calculate(horizontal, vertical)
cnt += 1
horizontal -= 2
vertical -= 2
if total_brown == brown:
return True
def solution(brown, yellow):
answer = []
block_size = brown + yellow
# i 는 세로길이
for i in range(3,block_size):
if block_size % i == 0 :
if check(int(block_size/i), i, brown, yellow):
answer = [int(block_size/i),i]
return answer
뭐 나름 깔끔하게 짠 것 같다.
check()
함수에서 조건에 만족하는지 체크해서 맞으면 답을 리턴한다.check()
함수 설명
테두리를 채운다. 테두리는
n*m
size일 때 2n + 2m - 4 인 것을 이용했다.
while
loop을 돌다가 테두리를 너무 많이 채우거나, 조건에 맞으면 나가게 되며, 마지막 리턴할 때 조건에 맞는지만 체크한다.
뭐... 사실 별 거 없지만 이 글을 쓴 이유는 다른 사람의 코드를 보고 발상의 전환을 맛보았기 때문이다. 함 보자.
def solution(brown, red):
for i in range(1, int(red**(1/2))+1):
if red % i == 0:
if 2*(i + red//i) == brown-4:
return [red//i+2, i+2]
가로 × 세로 = 격자 합
둘레의 합(가로 × 2 + 세로 × 2 - 겹치는부분4) = 갈색 둘레
물론 나도 이걸 쓰긴 했는데, 그냥 for 문 안에서 처리해버렸다.
return할 때도 참 짧게 작성했다.
뭐... 근데 처음 보고 이해하기는 어렵다.
아직 파이썬 실력이 살짝 낮은 것 같기도 하다.