공부 자료/알고리즘
(C/C++) 백준 9613번 - GCD 합
뚜루뚜루세니
2021. 7. 8. 23:02
728x90
문제 출처: https://www.acmicpc.net/problem/9613
9613번: GCD 합
첫째 줄에 테스트 케이스의 개수 t (1 ≤ t ≤ 100)이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있다. 각 테스트 케이스는 수의 개수 n (1 < n ≤ 100)가 주어지고, 다음에는 n개의 수가 주어진
www.acmicpc.net
1. 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <iostream> #include <algorithm> #include <string> using namespace std; int gcd(int a, int b) { // 최대 공약수 구현 if (b == 0) return a; return gcd(b, a % b); } int main() { int test,n; int arr[101]; scanf("%d", &test); //test케이스 갯수 for (int i = 0; i < test; i++) { scanf("%d", &n); //수의 갯수 for (int j = 0; j < n; j++) { scanf("%d", &arr[j]); //수를 배열에 넣어주기 } long long sum = 0; for (int k = 0; k < n; k++) { for (int m = k+1; m < n; m++) { sum += gcd(arr[k], arr[m]); //배열 전체 반복하면서 gcd합을 구해준다. } } printf("%lld\n", sum); } } | cs |
2. 해결과정
GCD를 유클리드 호제법을 이용해서 구해주면 나머지는 쉽게 해결할 수 있었다.
1) 입력받은 두개의 자연수 중 큰 값을 a, 작은 값을 b라고 한다.
2) a를 b로 나눈다.
3) a를 b로 나눠서 발생한 나머지를 r이라고 하고, a를 b값에 대입, b에 r값을 대입하여 2번 과정 반복
4) 나머지가 발생하지 않으면 b값이 입력 받은 두 수의 최대 공약수 이다.
3. 느낀점
유클리드 호제법을 알면 쉽게 풀리는 문제이다. 이를 재귀를 사용하느냐 아니면 사용하지 않느냐에 따라서도 코드의 길이가 매우 달라지기 때문에 공부할게 점점 많아진다고 생각한다.
728x90