Algorithm/코딩테스트 (Python)
[프로그래머스][완전탐색] 카펫
싱브이
2023. 12. 6. 22:18
728x90
반응형
문제
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
내 생각
악 완전탐색 쉬운듯 넘 어렵다 이건 수학적 센스도 필요하고 규칙도 잘 찾아야 하고 구냥 뭐 아무튼 해낼거라는 얘기
이 문제도 문제를 이해하고 엥? 했다. 그래서 조금의 검색도 함 ㅎㅎ ㅠ
아무튼 내가 해결한 방법은
1. 전체 크기를 구한다.
2. 모든 가로 세로가 될 수 있는 경우의 수를 구한다. : 제곱근을 구하는 int(total**0.5) 를 잊지마,,
3. 노란색 부분을 구한다
4. 노란색 부분이 일치해? 그게 답이다
그러니까 가장 중요했던건 약수 구할 줄 알아? 인 것같다 !
(다른 사람의 풀이보니까 수학적 공식을 도입한 사람도 있었고, 구냥 대박이었다,,)
내 코드
def solution(brown, yellow):
size = brown + yellow
# 약수의 쌍을 찾아가며 가로, 세로 길이 검증
# total의 제곱근까지만 반복
for i in range(1, int(size**0.5)+1):
#n을 i로 나누었을 때 나누어 떨어지면 그게 일부의 약수들
if size % i == 0:
# i가 가로 길이, total//i가 세로 길이
#(i-2)는 갈색 테두리의 가로 길이를 제외한 한 행의 노란색 수
#(size//i-2)는 갈색 테두리의 세로 길이를 제외한 한 열의 노란색 수
y = (i-2) * (size//i-2)
# 노란색수가 일치하는지 확인
if y == yellow:
return [size//i, i]
다른 사람의 코드
def solution(brown, yellow):
w = (brown / 2) + 1
h = 1
while w >= h:
if (w-2) * (h-2) == yellow:
return [w, h]
w -= 1
h += 1
728x90
반응형