이번에는 아이디어 적인 부분에서 나름 창의적으로 한 것 같아서 풀이를 공유하기 설렌다!
내가 생각한 아이디어는 다음과 같다.
1. 두 수를 분수꼴로 나타낸다. (이 때, 분수는 기약분수가 된다.)
2. 나눠진 수를 분자로 나누면 GCD 등장!
이 아이디어면 소수를 따로 판별할 필요 없이 가능하다.
예시를 두 개 들어서 설명해 보겠다.
숫자 30과 45가 있다고 가정해 보면, 1번에 의해 30/45인 2/3이 나타나게 된다.
이후 2번에 의해 30/2 = 15가 나타나게 되는데, 이는 GCD이다.
하나 더, 숫자 3과 7이 있다고 가정해 보면, 1번에 의해 3/7이 나타나게 된다.
이후 2번에 의해 3/3 = 1이 나타나게 되는데, 이 역시 GCD이다.
이 행위가 가능한 이유를 보면, "기약 분수"로 표현한다는 것 자체가 GCD로 나눠진 값이다.
즉, GCD로 나눠진 값을 원래 값으로 나누면 GCD가 나타나게 되는 것!
이 아이디어를 구현하기 위해서 combinations와 Fraction library를 import 하였다.
from itertools import combinations # 수학에서의 조합을 사용할 수 있게 해주는 library
from fractions import Fraction # 분수식으로 표현할 수 있게 해주는 library
import sys
input = sys.stdin.readline # 시간 초과 error를 해결하기 위한 input함수 재정의
n = int(input()) # 테스트 케이스의 개수
for _ in range(n):
answer = 0 # 정답을 저장하는 변수
num, *numbers = map(int, input().strip().split(' ')) # 개수와 숫자들을 모두 입력받는 방법
for (num1, num2) in list(combinations(numbers, 2)): # numbers에서 2개씩 뽑는 조합을 진행
f = Fraction(num1, num2) # num1과 num2를 분수식으로 표현 (이 때, 기약분수로 표현됨)
answer += num1 // f.numerator # num1을 분자로 나눈다면 GCD (num2을 분모로 나눠도 동일)
print(answer) # 정답 출력
숫자를 입력받는 방법을 모른다면 Asterisk를 검색해보길 권장한다.
'Algorithm Test > BaekJoon' 카테고리의 다른 글
BaekJoon 3036 - 링 풀이 (Python) (0) | 2022.03.07 |
---|---|
BaekJoon 14225 - 부분수열의 합 (Python) (0) | 2022.03.06 |
BaekJoon 10799 - 쇠막대기 (Python) (0) | 2022.03.04 |
BaekJoon 17413 - 단어 뒤집기 2 (Python) (0) | 2022.03.03 |
BaekJoon 10866 - 덱 (Python) (0) | 2022.03.02 |