Algorithm/백준
[알고리즘]백준 5618번: 공약수
Im_light.J
2023. 2. 21. 14:05
728x90
알고리즘 유형: 수학, 브루트 포스
문제
자연수 n개가 주어진다. 이 자연수의 공약수를 모두 구하는 프로그램을 작성하시오.
입력
첫째 줄에 n이 주어진다. n은 2 또는 3이다. 둘째 줄에는 공약수를 구해야 하는 자연수 n개가 주어진다. 모든 자연수는 108 이하이다.
출력
입력으로 주어진 n개 수의 공약수를 한 줄에 하나씩 증가하는 순서대로 출력한다.
풀이
일단 최대 공약수를 계산해주겠습니다
두 수 a,b의 최대 공약수는 작은 수 min(a,b)를 넘어 가지 않으며 a와 b를 나누었을때 나누어떨어지는 수입니다
range를 통해 min(a,b)부터 1까지 스캔해주면서 나누어지면 반복문을 탈출하고 이때의 숫자를 return 합니다
숫자의 갯수는 최소 2 최대 3입니다. 조건문을 통해 각각의 경우를 나누어줍니다.
import sys
import math
N = int(sys.stdin.readline().strip())
nums = list(map(int, sys.stdin.readline().strip(" ").split()))
def gcd(a,b): #math.gcd로 대체가능
for i in range(min(a,b),0, -1):
if a % i == 0 and b % i == 0:
return i
if N==2:
gcd_ =gcd(nums[0], nums[1])
else:
gcd_ = gcd(gcd(nums[0], nums[1]), nums[2])
answer =set()
for i in range(1, int(gcd_**0.5)+1):
if gcd_%i == 0:
answer.add(i)
answer.add(gcd_//i)
answer =sorted(answer)
print(*answer, sep="\n")
728x90