문제
양의 정수 n개가 주어졌을 때, 가능한 모든 쌍의 GCD의 합을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 t (1 ≤ t ≤ 100)이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있다. 각 테스트 케이스는 수의 개수 n (1 < n ≤ 100)가 주어지고, 다음에는 n개의 수가 주어진다. 입력으로 주어지는 수는 1,000,000을 넘지 않는다.
출력
각 테스트 케이스마다 가능한 모든 쌍의 GCD의 합을 출력한다.
예제 입력 1 복사
3
4 10 20 30 40
3 7 5 12
3 125 15 25
예제 출력 1 복사
70
3
35
- GCD를 구하는 방식에는 2가지 방법이 있다. 유클리드 호제법을 사용하여야만 시간 초과 없이 풀 수 있다.
1. 자연수 2부터 a 와 b중 작은수까지 나누어서 0이 되는 수를 찾는 방식 O(n)
2. 유클리드 호제법을 이용하여 구하는 방식 O(log n)
- 오래전 배웠던 수학을 다시금 기억나게 해주었던 문제였다.
2개의 자연수 a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면 (단 a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r0를 구하고, 다시 r을 r0로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다.
더보기
import sys
import itertools as it
input = sys.stdin.readline
def gcd(a, b):
if a % b == 0: return b
return gcd(b, a%b)
t = int(input())
for _ in range(t):
case = input().strip().split(" ")
n = case[0]
result = 0
for a, b in it.combinations(case[1:], 2):
# print(a,b)
# print(gcd(a,b))
result += gcd(int(a), int(b))
print(result)
'ComputerScience > 코딩테스트' 카테고리의 다른 글
[프로그래머스] 여행경로(DFS/BFS) (0) | 2022.03.25 |
---|---|
[프로그래머스] 순위 - python3 (0) | 2022.03.25 |
[백준 21608] 상어초등학교 - python (0) | 2022.03.17 |
[백준14567] 선수과목 - python3 (0) | 2022.03.15 |
[백준 2630] 색종이 만들기 - python3 (0) | 2022.03.11 |