개발자 블로그
프로그래머스 - 카펫(완전탐색) 본문
문제 설명
더보기
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
10 | 2 | [4, 3] |
8 | 1 | [3, 3] |
24 | 24 | [8, 6] |
※ 공지 - 2020년 2월 3일 테스트케이스가 추가되었습니다.
※ 공지 - 2020년 5월 11일 웹접근성을 고려하여 빨간색을 노란색으로 수정하였습니다.
나의 풀이
# 브라운과 옐로우 갯수의 합을 구하고 합의 약수를 구한다.
# 제곱근이 정수라면 제곱근이 가로 세로
# 인트가 아니라면 그 양쪽에 있는 약수가 가로 세로의 길이
def solution(brown, yellow):
s = brown + yellow
if s**0.5 == int(s**0.5):
answer = [s**0.5, s**0.5]
else:
for i in range(int(s**0.5)+1, s):
if not s % i and (i-2)*(s//i-2) == yellow: # i가 s의 약수이면서 두 수에서 -2를 한 값의 곱이 yellow가 나와야한다.
answer = [i, s//i]
break
return answer
나의 알고리즘
1) 두 수의 합의 약수 중 가장 안쪽에 있는 값 예를 들어 두 수의 합이 12이면 3과 4가 답이라고 생각
2) 하지만 (가로길이 -2)*(세로길이-2) = 옐로우 블럭의 갯수 조건도 만족해야한다.
*문제를 보면 두가지 조건을 찾아야한다.
1) 두 블럭의 갯수의 합 = 넓이(가로 * 세로)
2) (가로길이 -2)*(세로길이-2) = 옐로우 블럭의 갯수
이 두조건을 파악하면 문제를 접근하기 쉽다. 이차방정식으로 접근할 수도 있고...나는 2번째 조건을 늦게 찾게 되어서 위와같이 접근을 하게되었다. for문 안 if 문에 and로 2번째 조건 추가!
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 다리를 지나는 트럭(스택/큐) (0) | 2022.05.13 |
---|---|
프로그래머스 - (정렬) H-Index (0) | 2022.05.13 |
프로그래머스 - 가장 큰 수(정렬) (0) | 2022.05.12 |
프로그래머스 - 프린터(스택/큐) (0) | 2022.05.11 |
프로그래머스 - 전화번호 목록(해시) (0) | 2022.05.10 |