카펫 문제 바로가기

나의 풀이

문제를 해결하기 위해 끄적이다가 결국엔 약수를 구하는 아이디어로 접어들었다. 전체 넓이와 노란색 영역 넓이의 관계를 생각해보다가 다음을 만족한다는 사실을 발견했다. $ yellow_area = (width-2)*(height-2) $ 잘 이해되지 않는다면 다음 사진처럼 노란색을 움직인다는 아이디어로 접근해보자.

def solution(brown, yellow):
    total = brown + yellow
    for i in range(3, total//2):
        if total % i == 0:
            width,height = (total//i),i
            if (width-2)*(height-2) == yellow:
                return (width, height)
    return -1

다른 풀이 구경하기

나는 넓이:넓이 관계에 집중했다면 다른 풀이에서는 넓이:둘레 상관관계로 접근한 것도 있었다. 전체 둘레에서 한 칸을 갈색 타일에 대응시키면 각 모서리(즉 4개)가 더블 카운팅되는데, $ 2*(height+width) = (brown - 4) $ 만족시키는지 확인하는 방법도 존재했다.

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]

출처