문제 출처
programmers.co.kr/learn/courses/30/lessons/42842
코딩테스트 연습 - 카펫
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과
programmers.co.kr
문제 설명
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] |
나의 코드
def solution(brown, yellow):
total = brown + yellow
y = 0
while True:
y += 1 #1)
x = yellow/y
if x != int(x): #2)
continue
elif (x+2)*(y+2) == total: #3)
return [x+2, y+2]
break
yellow의 가로를 x, 세로를 y로 설정했다.
1) 문제 제한사항에서 가로의 길이는 세로의 길이와 같거나 길다고 했으므로 세로인 y를 기준으로 1씩 카운트 해줬다.
2) y에 따른 x가 정수가 아니면 다음 loop를 수행하도록 if문을 설정해준다.
3) 문제 지문을 분석해보면, yellow의 가로와 세로에 각각 2씩 추가해준 것이 전체 카페트의 가로, 세로라는 것을 알 수 있다. 따라서 yellow의 가로와 세로에 각각 2를 더한 것의 넓이가 brown과 yellow를 합한 값과 동일한지 검사하는 조건문을 설정해주었다.
다른 풀이
def solution(brown, yellow):
mn = brown + yellow
for m in range(3, int(mn ** 0.5) + 1):
if mn % m == 0 and 2 * (mn // m + m - 2) == brown:
return [mn // m, m]
이 풀이에서 인상적이었던 것은 m의 범위를 int(mn**0.5)+1까지 설정해주었다는 것이다!
m을 세로라고 했을 때 문제에서 가로가 더 길다고 했으니 최댓값은 카펫 넓이의 제곱근을 초과하지 않을 것이다.
이런 논리를 사용하게 되면 코드의 효율성을 더 높일 수 있다.
'3. 알고리즘 > 프로그래머스' 카테고리의 다른 글
[python] 39. 최댓값과 최솟값 (0) | 2021.01.24 |
---|---|
[python/완전탐색] 38. 소수 찾기 (0) | 2021.01.23 |
[python/정렬] 36. H-Index (0) | 2021.01.21 |
[python/힙] 35. 더 맵게(feat. heapq 모듈) (0) | 2021.01.20 |
[python] 34. 124 나라의 숫자 ★ (0) | 2021.01.19 |