-
[프로그래머스/Python] 멀쩡한 사각형Algorithm/Programmers codes 2020. 4. 30. 17:21
문제 설명
가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을 따라 1cm × 1cm의 정사각형으로 잘라 사용할 예정이었는데, 누군가가 이 종이를 대각선 꼭지점 2개를 잇는 방향으로 잘라 놓았습니다. 그러므로 현재 직사각형 종이는 크기가 같은 직각삼각형 2개로 나누어진 상태입니다. 새로운 종이를 구할 수 없는 상태이기 때문에, 이 종이에서 원래 종이의 가로, 세로 방향과 평행하게 1cm × 1cm로 잘라 사용할 수 있는 만큼만 사용하기로 하였습니다.
가로의 길이 W와 세로의 길이 H가 주어질 때, 사용할 수 있는 정사각형의 개수를 구하는 solution 함수를 완성해 주세요.제한사항
W, H : 1억 이하의 자연수- 코드
def solution(w,h): if w == h : return (w * h - w) def gcd(a,b): if b==0 : return a return gcd(b, a%b) if w > h : l = w s = h else : l = h s = w g = gcd(l,s) return w*h-(w+h-g)
- 로직
먼저 가로와 세로가 같은 직사각형, 즉 정사각형인 경우에는 대각선이 지나가는 격자는 가로길이(=세로길이)만큼이다.
가로와 세로를 비교해서 같은 경우에는 가로 * 세로에서 가로길이만큼 빼고 리턴한다.
그 외에는 최대공약수를 구해야 하므로 gcd 함수를 선언한다. 유클리드 알고리즘을 이용하는 함수이다.
recursive하게 b가 0이 나올 때까지 gcd를 호출한다.
이때 첫 번째 파라미터가 큰 수로 넣어야 하므로 가로와 세로를 비교해서 l, s 변수를 구해서 파라미터로 넣는다.
직사각형인 경우에 대각선이 지나가는 격자는 (가로 * 세로 - 최대공약수) 만큼이다.
그래서 최대공약수 g를 구해주고 가로*세로한 전체 갯수에서 (가로 * 세로 - g)만큼을 빼서 리턴한다.
다른 사람 코드를 보니까 나처럼 큰수, 작은수를 따로 안구해준 거를 보니 테스트케이스에서는 무조건 세로>= 가로인듯하다.
왜 조건에 넣어주지 않았지..?
- 문제
https://programmers.co.kr/learn/courses/30/lessons/62048?language=python3
'Algorithm > Programmers codes' 카테고리의 다른 글
[프로그래머스/Python] 연습문제 Lv2. 다음 큰 숫자 (0) 2020.05.20 [프로그래머스/Python] 124나라의 숫자 (0) 2020.05.16 [프로그래머스/Python] 탐욕법 level 1. 체육복 (0) 2020.04.03 [프로그래머스/Python] 정렬 level 2. H-Index (0) 2020.04.03 [프로그래머스/Python] 힙(Heap) level 2. 라면공장 (0) 2020.03.21