라떼는말이야
[프로그래머스 lv2] 카펫 (파이썬) 본문
문제 설명
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
입출력 예
나의 풀이
def solution(brown, yellow):
total = brown + yellow
for i in range(3, int(total**0.5) + 1):
if not total % i and (i-2) * ((total//i)-2) == yellow:
return [total//i, i]
아이디어는 다음과 같다.
갈색 격자와 노란 격자의 합이 전체 격자의 크기가 될 것이다.
그리고 전체 격자가 직사각형이 되기 위해서는 가로 x 세로 로 나타낼 수 있어야 한다. 즉, 약수를 구하면 된다.
문제의 조건 중 노란 격자가 1 이상이기 때문에 전체 격자의 크기는 최소 3x3 이상이어야 한다.
그래서 for문의 range 범위를 3부터 시작했다.
어떤 수의 약수는 항상 짝이 존재한다. 짝을 이루는 두 수가 다른 수라면 하나는 크고 하나는 작을 것이다. (당연한 말)
약수의 짝 중 작은 수는 제곱근보다 크지 않을 것이다. 그렇기 때문에 range 의 끝 범위를 total ** 0.5 까지 하면 된다.
i로 나누어 떨어지면 약수인 것이고, 2씩 뺀 수를 곱한 것이 yellow의 크기와 같다면 답을 찾은 것이기 때문에 total//i와 i를 return 하면 된다.
(i 보다 total//i를 먼저 하는 이유는 i가 더 작거나 같은 값이고, 문제 조건에서 가로 길이가 세로 길이와 같거나 더 길다고 했기 때문이다)
'알고리즘 > 코딩 테스트' 카테고리의 다른 글
[프로그래머스 위클리 챌린지] 부족한 금액 계산하기 (python) (0) | 2021.08.04 |
---|---|
[프로그래머스 lv2] 소수 찾기 (파이썬) (0) | 2021.08.03 |
[구름LEVEL - 별 5개] 어느 개발자 이야기 (파이썬) (0) | 2021.08.01 |
[프로그래머스 lv2] [1차]뉴스 클러스터링 (파이썬) (0) | 2021.07.22 |
[프로그래머스 lv2] 행렬 테두리 회전하기 (파이썬) (1) | 2021.07.21 |
[프로그래머스 lv1] 숫자 문자열과 영단어(파이썬) (0) | 2021.07.19 |
[프로그래머스 lv2] 이진 변환 반복하기 (0) | 2021.07.03 |
[프로그래머스 lv2] 위장 (파이썬) (0) | 2021.07.02 |