반응형
문제
양의 정수 n개가 주어졌을 때, 가능한 모든 쌍의 GCD의 합을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 t (1 ≤ t ≤ 100)이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있다. 각 테스트 케이스는 수의 개수 n (1 < n ≤ 100)가 주어지고, 다음에는 n개의 수가 주어진다. 입력으로 주어지는 수는 1,000,000을 넘지 않는다.
출력
각 테스트 케이스마다 가능한 모든 쌍의 GCD의 합을 출력한다.
예제 입력34 10 20 30 40 3 7 5 12 3 125 15 25 |
예제 출력703 35 |
풀이
GCD(Greatest Common Divisor)란 최대공약수를 의미한다.
테스트 케이스마다 주어진 수로 만들 수 있는 모든 쌍의 최대공약수를 구한 뒤, 이를 다 더한 것을 출력하면 된다.
두 가지의 수로만 만들 것이므로 이중 for문으로 모든 쌍을 구할 수 있다.
파이썬의 경우 math 모듈에서 사용 가능한 gcd 함수로 최대공약수를 쉽게 구할 수 있다.
import sys,math
input = sys.stdin.readline
for _ in range(int(input())):
a = list(map(int,input().split()))
n,nums,r = a[0],a[1:],0
for i in range(n-1):
for j in range(i+1,n):
r += math.gcd(nums[i],nums[j])
print(r)
math 모듈 대신 유클리드 호제법을 이용하는 방법도 있다.
유클리드 호제법은 아래 포스팅에 자세히 기술되어 있다.
import sys,math
input = sys.stdin.readline
def gcd(n1,n2):
while(True):
r = n2 % n1
if r == 0:
return n1
n2 = n1; n1 = r
for _ in range(int(input())):
a = list(map(int,input().split()))
n,nums,r = a[0],a[1:],0
for i in range(n-1):
for j in range(i+1,n):
r += gcd(nums[i],nums[j])
print(r)
반응형
'알고리즘 연습 > 수학, 정수론, 기하' 카테고리의 다른 글
[🥈1 / 백준 6588 / 파이썬] 골드바흐의 추측 (0) | 2021.10.08 |
---|---|
[🥇5 / 백준 2166 / 파이썬] 다각형의 면적 (0) | 2021.09.24 |
[🥉2 / 백준 13458 / 파이썬] 시험 감독 (0) | 2021.09.05 |
[🥈3 / 백준 1004 / 파이썬] 어린 왕자 (0) | 2021.08.31 |
[🥉2 / 백준 1225 / 파이썬] 이상한 곱셈 (0) | 2021.07.18 |