단의 개발 블로그
카펫 본문
💡 문제
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
💡 제한사항
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
입출력

입출력 예 #1
위의 예시와 같습니다.
입출력 예 #2
문자열이 남아있지만 짝지어 제거할 수 있는 문자열이 더 이상 존재하지 않기 때문에 0을 반환합니다.
✨ 풀이
def solution(brown, yellow):
answer = []
carpet = brown + yellow
for i in range(3, carpet):
y = i
x = carpet / y
if(x >= y):
if ((x - 2) * (y - 2)) == yellow:
answer.append(x)
answer.append(y)
break
return answer
공식을 찾지 못해서 조금 헤맸다. 먼저 노란색 격자 양옆으로 갈색 격자가 존재한다. 따라서 노란색 격자 크기는 위아래 해서 -2, 양옆 해서 -2를 해줘야 한다. 전체적인 풀이 과정은 다음과 같다.
- 갈색과 노란색 크기를 더해서 카펫의 총 크기를 먼저 구해준다.
- 해당 카펫은 노란색 격자를 감싸야 하기 때문에 최소 3칸 부터 시작해야 한다. 따라서 반복문은 3부터 시작한다.
- 세로 크기도 최소 3부터 시작해야 하기 때문에 3으로 저장해주고, 가로 크기는 카펫 총 크기에서 세로 크기로 나눠준다.
- 구한 가로가 세로보다 클 경우 앞 서 구한 노란색 격자 공식과 같은지 비교하고, 해당 값과 일치하면 반복문을 종료한다.