프로그래머스(LV2)
[프로그래머스][Python] 카펫
메가구글
2023. 3. 22. 03:14
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]
접근방식
위의 그림처럼 카펫으로 최적으로 배치할 때 갈색은 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가 긴 조건이 된다.