최근에 문제를 많이 풀게 되면서 레벨 1을 다 풀고 이제 2로 넘어왔다.
( 패턴이 겹치는 문제는 안 올렸는데 필요하다면 댓글로 문의 바랍니다. )
프로그래머스 멀쩡한 사각형을 Python으로 풀어보겠다.
이 문제는 프로그래머스에서 2019년 출제된 코딩 테스트이다.
레벨은 2다.
문제
위와 같이 사각형의 w, h가 주어지면 그 사각형을 대각선으로 자르고
선에 의해 나눠지지 않은 멀쩡한 사각형의 수를 구하면 된다.
구현
맨 처음에 생각하는데 오래 걸렸다.
뭔가 규칙성이 보여서 작게 잘라 생각해봤다.
(8,12)의 사각형에서 위와 같은 (2,3)이 나온다.
닮음의 형태에서 반복되는 것을 알 수 있다.
이 형태에서 패턴이 반복하는 횟수는 최대공약수(4)이다.
그렇다면 한 패턴에서 지워지는 사각형 수는 어떻게 되는지 보자
현재 (2,3)에서 4개가 지워졌다.
가로 세로 각각 2, 3칸을 가며 대각선으로 지우기에 2+3-1 = 4 가 나온다.
이는 (1,3), (3,4)에서도 적용이 된다.
각각 지워야 할 것이 3+1-1=4, 3+4-1=6이 나온다.
이 방법이 이해가 힘들면 다른 방법을 생각해도 된다.
(8,12)에서 최대공약수로 (2,3)이 되면 기울기가 1.5이기 때문에 두 칸을 지우게 된다.(소수점은 올림으로 계산하면 됨)
2만큼 갈 것이기에 *2를 하면 2*2는 4가 나온다.
충분히 이해했을 거라고 보고 코드를 보겠다.
코드
def solution(w,h):
big, small = max(w,h), min(w,h)
while small:
big, small = small, big%small
return w*h-(w+h-big)
우선 유클리드 호제법을 이용해 다음과 같이 최대공약수를 뽑는다.
위에서 big이 최대공약수가 된다.
그리고 전체에서 지워진 개수를 빼면 정답이다.
이 문제는 코딩은 어렵지 않지만
수학적인 사고를 잘해서 패턴을 빨리 찾아내는 것이 포인트다.
'Coding Test > Python' 카테고리의 다른 글
[프로그래머스] 올바른 괄호 Python Code (0) | 2022.08.30 |
---|---|
[프로그래머스] 124나라의 숫자 (0) | 2022.08.29 |
[프로그래머스] 문자열 내 마음대로 정렬하기 Python Code (0) | 2022.08.28 |
[프로그래머스] 소수 찾기 Python Code (0) | 2022.08.28 |
[프로그래머스] [1차] 다트 게임 Python Code (0) | 2022.08.27 |
댓글