문제풀이/수학

[Python/파이썬] 백준 5618번 공약수

딜레이레이 2023. 2. 4. 21:24
 

5618번: 공약수

첫째 줄에 n이 주어진다. n은 2 또는 3이다. 둘째 줄에는 공약수를 구해야 하는 자연수 n개가 주어진다. 모든 자연수는 108 이하이다.

www.acmicpc.net

문제

자연수 n개가 주어진다. 이 자연수의 공약수를 모두 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 n이 주어진다. n은 2 또는 3이다. 둘째 줄에는 공약수를 구해야 하는 자연수 n개가 주어진다. 모든 자연수는 108 이하이다.

 

출력

입력으로 주어진 n개 수의 공약수를 한 줄에 하나씩 증가하는 순서대로 출력한다.

 

코드

import math

# 최대공약수 구하기 (유클리드 호제법)
def gcd(a, b):
    if b > a:
        a, b = b, a
    if a % b == 0:
        return b
    return gcd(b, a % b)

# 약수 구하기
def get_divisor(num):
    res = []
    # 일단 num의 제곱근까지만 약수 구하기
    for i in range(1, int(math.sqrt(num)) + 1):  
        if num % i == 0:
           res.append(i) 
    # 제곱근까지만 구한 약수들 가지고 num을 나눠서 나머지 약수 구하기
    l = len(res)
    for i in range(l):
        res.append(num // res[i])
    return sorted(set(res))

n = int(input())
nums = list(map(int, input().split()))

if n == 2:
   for i in get_divisor(gcd(nums[0], nums[1])):
       print(i)
else:
    for i in get_divisor(gcd(nums[0], gcd(nums[1], nums[2]))):
        print(i)

두 수의 최대공약수를 구하여 그 수의 약수를 구하는 방법으로 풀이하였다.

두 수의 최대공약수는 유클리드 호제법을 이용하여 구하였다.

그리고 그 수에 대해 효율적으로 약수 구하는 방법을 사용하여 약수들을 구해주었다.

 

 

  • 유클리드 호제법이란?
 

유클리드 호제법 (최대공약수 구하는 알고리즘)

유클리드 호제법은 두 양의 정수, 또는 두 다항식의 최대공약수를 구하는 알고리즘이다. 호제법(互除法)이라는 말은 서로(互) 나누기(除) 때문에 붙여진 이름이다. 두 양의 정수 a,b (a>b)에 대하여

zero0205.tistory.com

 

  • 효율적으로 약수 구하기
 

효율적으로 약수 구하기

어떠한 양의 정수 N의 약수를 구할 때 간단하게 생각해보면 다음과 같이 1부터 N까지 나누어보면 쉽게 구할 수 있다는 것은 누구나 생각할 수 있다. def get_divisor(num): res = [] for i in range(1, num + 1): if

zero0205.tistory.com