본문 바로가기
Algorithm/최적화

[백준] 2436번 공약수

by HANNI하니 2023. 10. 23.

사용 언어 - Python3

문제 -  2436번 공약수

 

2436번: 공약수

첫째 줄에 두 개의 자연수가 빈칸을 사이에 두고 주어진다. 첫 번째 수는 어떤 두 개의 자연수의 최대공약수이고, 두 번째 수는 그 자연수들의 최소공배수이다. 입력되는 두 자연수는 2 이상 100,0

www.acmicpc.net

 

정답

최대공약수 GCD(A,B), 최소공배수 LCM(A,B) (정답 맞춘 여부 X)

최대공약수 GCD(A,B)

1. GAP을 줄이기

공약수 = 일정한 간격으로 JUMP해서 A와 B 모두에 도달할 수 있는 수

GCD(12,8) = 0부터 8까지, 8부터 12까지 JUMP가 가능한 수 = GCD(8,12-8)

GCD(A,B) = GCD(B-A,A) = GCD(A-(B-A), B-A)

두 수이 최대공약수 = 간격을 최소로 줄여도 동일하다

 

2. 최대공약수 = 두 수 중 하나로 나누어서 나머지가 생기지가 않는다

12%8 = 4(나머지)

8%4 = 0(나머지 없음)

나머지 생기지 않으면, 두 수 중 작은 값이 최대공약수

 

3. 한 수를 가능한 만큼 갭을 줄인다.

하나의 수를 작은 수로 되는 만큼 뺀다 = 나누고 나서 나머지

121-7-7-7-7-7-.... = 121%7

7로 뺄수있을만큼 빼라 = 7로 나눈뒤에 나머지

 

 

최소공배수 LCM(A,B) = A*B // 최소공약수

 

 

최대공약수, 최소공배수의 범위는 두 값을 더한 값maxg보다는 무조건 작다.

gcd부터 루트 maxg까지 gcd만큼 jump 하면서 최대공약수를 찾는다.

_gcd(i,maxg//i) == gcd, _lcd(i,maxg//i) == lcm 를 만족하는

i와 maxg//i는 최소공배수, 최대공약수이다.

gcd,lcm = map(int,input().split())
maxg = gcd*lcm

# 최대공약수
def _gcd(a, b):
    while a % b != 0 : # 나머지가 0이 되는 순간 멈춘다 = 최대공약수 찾을 때까지 반복
        tmp = a % b
        a = b
        b = tmp
    return b # 작은 수

# 최소공배수
def _lcm(a,b):
    return a*b//gcd

answer = []

for i in range(gcd, int(maxg**0.5) + 1, gcd):
    if _gcd(i, (maxg//i)) == gcd:
        if _lcm(i, (maxg//i)) == lcm:
            answer.append((i,maxg//i))

print(*answer[-1])

 

python 모듈 활용하는 방법

import math

math.gcd()

 

 

레퍼런스

  • 정답 깃허브

https://github.com/yyeongeun/codingtest/blob/main/BAEKJOON/2436_%EA%B3%B5%EC%95%BD%EC%88%98.py

 

'Algorithm > 최적화' 카테고리의 다른 글

[백준] 14252번 공약수열  (1) 2023.10.23
[백준] 1407번 2로 몇 번 나누어질까  (1) 2023.09.22
[백준] 14232번 보석 도둑  (0) 2023.09.22
[백준] 11653번 소인수분해  (0) 2023.09.21
[백준] 1979번 소수 찾기  (0) 2023.09.21

댓글