Programming/Algorithm

[프로그래머스] 멀쩡한 사각형 (by Python)

oranz.23 2021. 5. 16. 03:57

문제

https://programmers.co.kr/learn/courses/30/lessons/62048

 

코딩테스트 연습 - 멀쩡한 사각형

가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을

programmers.co.kr

 

풀이

from math import gcd

def solution(w,h):
    return w * h - (w + h - (gcd(w, h)))

 

코드는 한 줄만에 끝났지만 정말 고민을 많이 하게 만든 문제였다.

대각선상에 있는 사각형의 개수에 무슨 규칙이 있을지 발견하기가 쉽지 않았던 것 같다. 

해답은 이러하다. w와 h의 최대공약수가 1인 직사각형의 경우, (w + h - 1)이 대각선상에 있는 사각형의 개수이다. 그 직사각형에서 높이 1당 하나씩, 넓이 1당 하나씩의 사각형을 지나게 되기 때문이다. 1을 빼는 이유는 첫 시작 사각형이 겹치기 때문이다. 이런 관점에서 볼 때, 최대공약수가 1이 아닌 사각형은 w + h에서 최대공약수만큼을 빼면 된다고 유추할 수 있다. (w + h - 1) 사각형이 대각선에 최대공약수만큼 존재할 테니까.