알고리즘 유형 : 정수론(유클리드 호제법)
풀이 참고 없이 스스로 풀었나요? : O
https://www.acmicpc.net/problem/20003
import sys
input = sys.stdin.readline
N = int(input())
items = [list(map(int, input().split())) for _ in range(N)]
dividend = [i[0] for i in items]
# 공통 분모 구하기
divisor = 1
for _, divider in items:
divisor *= divider
# 분모 divisor로 맞췄을 때의 분자들로 갱신하기
for i in range(len(dividend)):
dividend[i] *= divisor // items[i][1]
# 최대공약수 구하는 함수
def findGCD(a, b):
if a < b:
a, b = b, a
rest = a % b
while rest != 0:
a = b
b = rest
rest = a % b
return b
# 분자의 최대공약수 구하기
GCD = dividend[0]
for i in range(1, len(dividend)):
GCD = findGCD(GCD, dividend[i])
# 현재 result = divisor 분의 GCD
GCD_result = findGCD(GCD, divisor)
print(f'{GCD//GCD_result} {divisor//GCD_result}')
풀이 요약
우선 주어진 아이템의 분모를 공통 분모로 통일해주자.
1 4
2 5
이 경우에
5 20
8 20
이렇게 된다. 이제 이 아이템들의 약수이면서 최대인 수를 구해보자.
배운 점, 어려웠던 점