문제 확인
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
나의 풀이
- 노란 박스의 가로, 세로 정보에 따라서 갈색 박스의 정보가 결정 된다.
- 노란 박스의 가로, 세로는 박스 수의 약수이고, 가로는 그 중에서 큰 값이다.
- 따라서 노란 박스의 약수를 큰 수 부터 역으로 완전 탐색하면 문제를 풀 수 있다.
- 탐색 범위에 대해선, 가로의 길이가 세로 길이 보다 크거나 같기 때문에 제곱근 범위 까지만 찾으면 된다.
# 노란 박스 정보 : 가로 x 세로
# brown = ((가로 + 2) * 2 + 세로 * 2)
def solution(brown, yellow):
answer = [0, 0]
# yellow 박스의 가로 정보 확인
# 가로 길이는 세로 길이 보다 크거나 같기 때문에, 제곱근 까지만 탐색
for i in range(yellow, int(yellow ** 0.5) - 1, -1):
# 약수인 경우
if yellow % i == 0:
if brown == ((i + 2) * 2 + ((yellow) // i) * 2):
answer = [i + 2, (yellow // i) + 2]
break
return answer
다른 사람 풀이
- 갈색 블록의 절반은 (노란 블록의 가로 + 2 + 노란 블록의 세로)와 같다는 것을 활용해서 풀었다.
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]
참고
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr