Algorithm/Programmers
[Programmers][Lv.2] 멀쩡한 사각형
so-so
2022. 8. 23. 22:24
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/62048
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡IDEA
수학 문제다.
규칙을 찾는 게 중요한데, 처음엔 일차함수처럼 기울기를 사용해서 풀려고 했지만 12번 테스트 케이스가 시간초과가 발생했다.
다시 고민해서 최대공약수를 사용해서 푸는 방법을 생각했다. 최대공약수만큼 중복되는 점을 사용해서 가로+세로-최대공약수 만큼의 사각형을 사용할 수 없게 된다.
예시에서 가로 8 세로 12인 경우, 가로 2 세로 3인 사각형이 최대공약수인 4번 반복된다. 이 때 가로 2 세로 3인 사각형에서 행(빨강) 방향으로 3개, 열(파랑) 방향으로 2개인데 가장 첫번째 사각형(보라)은 겹치게 된다. 그래서 2+3-1=4 만큼의 사각형을 사용할 수 없다.
가로 2 세로 3인 사각형은 전체 가로 8 세로 12에서 최대공약수인 4를 나눈 값이기 때문에, 결국 사용할 수 없는 사각형의 총 개수는 2×4 + 3×4 - 1×4 = 8 + 12 - 4 = 16 이 된다. 즉, 가로+세로-최대공약수이다.
사용할 수 있는 사각형은 전체 넓이에서 구한 값을 빼주면 된다.
📌CODE
# 12번 테스트 케이스 시간초과
W, H = map(int, input().split())
ans = 0
for i in range(1, W):
ans += (H*i)//W
print(ans*2)
import math
W, H = map(int, input().split())
print(W*H - (W+H-math.gcd(W, H)))
반응형