[백준] 최대공약수와 최소공배수

최동혁·2022년 12월 6일
0

백준

목록 보기
10/68

최대공약수와 최소공배수

solved_ac[Class2][최대공약수와 최소공배수](https://www.acmicpc.net/problem/2609)

문제

두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.

출력

첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.

예제 입력 1

24 18

예제 출력 1

6
72

문제 해석

유클리드 호제법으로 최대공약수와 최소공배수를 구하면 된다.

유클리드 호제법

a와 b라는 자연수가 있다.

image

최대공약수

  • b로 a를 나눈 나머지를 r값으로 지정해준다.
  • b값을 a값으로 업데이트 시켜주고 나머지 값인 r을 b값으로 업데이트 시켜준다.
  • 이 과정을 나머지가 0이 될 때까지 반복한다.
  • 0이 되었을때의 b값이 최대공약수이다.

최소공배수

  • 위의 과정에서 맨 처음 입력 받은 a와 b값을 곱한다.
  • 최대공약수로 나눈다.
  • 그 값이 최소공배수이다.

결론

최대공약수 : 2

최소공배수 : 10 * 12 // 2 = 60

풀이

  • 자연수 입력 받음

  • 최대공약수 함수 gcd를 선언

  • 유클리드 호제법에 따라서 a와 b가 나누어질때까지 계속 돌릴것이기 때문에 재귀함수로 모델링

  • a와 b가 나누어지게 되면 재귀함수 호출은 멈추어야 하기 때문에 if문을 걸어준다.

  • 그게 아니라면 old b값을 new a값으로 업데이트 시키고 new b값에는 old a와 old b의 나머지 값으로 업데이트 시켜줘서 재귀함수 호출해준다.

  • 최대공약수 함수 result 선언

  • a와 b 그리고 최대공약수를 곱한 값을 리턴값으로 설정해준다.

import sys

M, N = map(int, sys.stdin.readline().split())

def gcd(M, N):
    if M % N == 0:
        return N
    else:
        return gcd(N, M % N)

def result(M, N, gcd):
    sum = 1
    sum *= M // gcd
    sum *= N // gcd
    sum *= gcd
    return sum

        
res_gcd = gcd(M, N)
res = result(M, N, res_gcd)
print(res_gcd)
print(res)        
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글