728x90
https://www.acmicpc.net/problem/9613
문제 설명
양의 정수 n개가 주어졌을 때, 가능한 모든 쌍의 GCD의 합을 구하는 프로그램을 작성하시오.
풀이 과정
- 나의 풀이
① 최대공약수 구하는 법
유클리드 호제법을 통해 최대공약수를 쉽게 구할 수 있다.
유클리드 호제법이란 기원전 300년 전에 나온 가장 오래된 알고리즘으로 유명하다.
유클리드 호제법으로 최대공약수를 구하는 방법은 다음과 같다.
○ 두 자연수 a,b에 대하여 a를 b로 나눈 나머지 r에 대해 a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이를 계속 반복하며 b가 0이 될 때, a값이 바로 최대공약수이다. (재귀와 반복이 느껴진다..!!)
② 문제에 적용하기
import sys
input = sys.stdin.readline
import math
def gcd_for(a,b) :
while b > 0 :
tmp = a%b
a = b
b = tmp
return a
T = int(input())
for _ in range(T) :
array_lst = list(map(int,input().split()))
n = array_lst[0]
num = math.factorial(n)//(math.factorial(n-2)*math.factorial(2))
num_lst = [0]*num
k = 0
for i in range(1,n+1) :
for j in range(i+1,n+1) :
num_lst[k] = gcd_for(array_lst[i],array_lst[j])
k += 1
print(sum(num_lst))
① 의 방법을 통해 gcd_for 이라는 함수를 만들어주었고, 각 테스트 케이스 개수를 변수 n으로 설정하였다.
각 테스트 케이스에서 GCD 쌍의 개수는 nC2이므로 이를 변수 num으로 저장하였다.
그 아래 코드들을 통해 GCD 쌍을 모두 num_lst에 저장하였고, 마지막에 sum 함수를 통해 모든 GCD 쌍을 더해주었다.
후기
고딩 때 배운 확통이 은근 쓸 곳이 많네.. 문제에 적용하여 직접 푸니 재밌다!!
'Algorithm > math' 카테고리의 다른 글
[백준] 1850 최대공약수 (파이썬 Python) (0) | 2021.08.13 |
---|---|
[백준] 2609 최대공약수와 최소공배수 (파이썬 Python) (0) | 2021.08.13 |
[백준] 13241 최소공배수 (파이썬 Python) (0) | 2021.08.13 |
[백준] 1934 최소공배수 (파이썬 Python) (0) | 2021.08.13 |
[백준] 2702 초6 수학 (파이썬 Python) (0) | 2021.08.13 |