백준

[백준] 1934 : 최소공배수 (Python/파이썬)

sson-coding 2025. 11. 10. 11:30

문제 링크

https://www.acmicpc.net/problem/1934

문제

두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 
이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 
예를 들어, 6과 15의 공배수는 30, 60, 90등이 있으며, 최소 공배수는 30이다.

두 자연수 A와 B가 주어졌을 때, A와 B의 최소공배수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 
둘째 줄부터 T개의 줄에 걸쳐서 A와 B가 주어진다. (1 ≤ A, B ≤ 45,000)

출력

첫째 줄부터 T개의 줄에 A와 B의 최소공배수를 입력받은 순서대로 한 줄에 하나씩 출력한다.

예제

입력

3
1 45000
6 10
13 17

출력

45000
30
221

정답 및 풀이

import sys
input = sys.stdin.readline

def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a

t = int(input())

for _ in range(t):
    a, b = map(int, input().split())
    g = gcd(a, b)
    print(a * b // g)
  1. import sys
    • 파이썬 기본 입력보다 더 빠른 입력 방식 사용하기 위해 sys 모듈 불러온다.
  2. input = sys.stdin.readline
    • 입력 속도를 높이기 위해 input()을 sys.stdin.readline으로 바꿔준다.
  3. def gcd(a, b):
    • 두 수의 최대공약수(GCD) 를 구하는 함수를 정의한다.
  4. while b != 0:
    • b가 0이 아닐 동안 반복한다 (유클리드 호제법 반복 조건).
  5. a, b = b, a % b
    • (a, b)를 (b, a를 b로 나눈 나머지)로 바꾼다.
    • 즉, 큰 수를 작은 수로 나눈 나머지를 계속 계산한다.
  6. return a
    • b가 0이 되면 그때의 a가 최대공약수이므로 반환한다.
  7. t = int(input())
    • 테스트 케이스 개수를 입력받는다.
  8. for _ in range(t):
    • t번 반복하면서 각 테스트 케이스를 처리한다.
  9. a, b = map(int, input().split())
    • 두 정수 a, b를 입력받는다.
  10. g = gcd(a, b)
    • 위에서 만든 함수로 두 수의 최대공약수 g를 구한다.
  11. print(a * b // g)
    • 최소공배수(LCM)를 출력한다.
    • 공식: LCM = (a × b) ÷ GCD

새롭게 배운 내용 및 느낀점

  • 유클리드 호제법
    • A,B 의 최대공약수(GCD) 를 빠르게 구하는 알고리즘
    • A를 B 로 나눈 나머지 와 B 의 최대 공약수는 A 와 B 의 최대 공약수가 같다.
    • GCD(A,B) = GCD(B, A%B)
    • 계속해서 A를 B로 나눠 B를 A에 나눈 나머지를 B 에 대입시켜서 B 가 0이 될때까지 반복을 하면 남는 A의 값이 바로 최대 공약수
  • 최소공배수
    • A,B 의 곱을 A,B 의 최대 공약수로 나누면 된다.
  • 참고자료