본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 9613번: GCD 합 -Python

728x90

[백준알고리즘] 9613번: GCD 합 -Python

https://www.acmicpc.net/problem/9613

 

9613번: GCD 합

문제 양의 정수 n개가 주어졌을 때, 가능한 모든 쌍의 GCD의 합을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수 t (1 ≤ t ≤ 100)이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있다. 각 테스트 케이스는 수의 개수 n (1 < n ≤ 100)가 주어지고, 다음에는 n개의 수가 주어진다. 입력으로 주어지는 수는 1000000을 넘지 않는다. 출력 각 테스트 케이스마다 가능한 모든 쌍의 GCD의 합을 출력한다. 예제 입

www.acmicpc.net

이번에는 최대공약수를 구하기 위해 math 모듈의 gcd를 사용했다. 처음에는 유클리드 호제법을 이용해 메서드를 만든 후 사용하도록 짰는데, 다른 분이 사용한 것을 보고 수정했다. 이런 게 있는지 처음 알았따..

 

모든 조합을 찾기 위해서 이중 for문을 돌리려다가 itertools의 combinations를 사용했다. combinations(iter, num)을 통해 iter의 원소 num개를 사용한 조합 쌍을 만들어냈다. 이 조합쌍을 list로 변환시킨 후에 각 숫자 쌍마다 gcd를 구해줬다.

 

별거 없는데 math의 gcd를 사용한 것을 찾기 위해서 작성했다.

import sys
from itertools import combinations
from math import gcd

testcase = int(sys.stdin.readline())
gcd_table = {}

for _ in range(testcase):
    nums = map(int, sys.stdin.readline().split()[1:])
    pair = list(combinations(nums, 2))
    res = 0
    for p in pair:
        if p in gcd_table.keys():
            res += gcd_table[p]
        else:
            gcd_table[p] = gcd(p[0], p[1])
            res += gcd_table[p]
    sys.stdout.write(str(res) + "\n")

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90