본문 바로가기

프로그래머스(LV2)

[프로그래머스][Python] 카펫

1. 문제설명

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

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 예

brown yellow return
10 2 [4,3]
8 1 [3,3]
24 24 [8,6]

 


2. 문제풀이

def solution(brown, yellow):
    answer = []
       
    for i in range(1,yellow+1):
    	#yellow의 약수를 이용해 row를 더 길게 설정한다.
        if(yellow % i ==0):
            yellow_row = (yellow /i)
            yellow_col = i
            if (2 * (yellow_row + yellow_col) + 4 == brown):
                return [yellow_row +2, yellow_col+2]

접근방식

그림1. 최적의 상태

위의 그림처럼 카펫으로 최적으로 배치할 때 갈색은 2a+2b+4로 표현할 수 있다.

즉 +4는 색칠되지 않는 모서리 부분 4곳을 의미하며

2a와 2b는 노란색의 가로, 세로의 색칠된 부분이다.

따라서 위의 코드에서 (yellow_row + yellow_col) *2 로 표현할 수 있는 것이다.

 

yellow%i == 0을 하는 이유는 문제에서 가로가 더 길기 때문에 row를 column보다 더 길게 설정해야 한다.

yellow의 약수를 이용하면 나눠진 값의 몫을 row, 나눈 수를 column으로 한다.

예시) yellow가 6 길이의 직사각형일 때, row = yellow % i, column = i가 된다. row = 3 column =2 

for문에서 작은 수부터 나눠나가기 시작하기 때문에 무조건 row가 긴 조건이 된다.