본문 바로가기
알고리즘/백준

[백준 9613] GCD 합 - 자바

by binghe819 2020. 4. 30.

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

 

9613번: GCD 합

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

www.acmicpc.net


1. 풀이

입력 값들을 받고 입력 값들끼리 반복문을 돌면서 두 개씩 짝을 지어 GCD(최소공배수)를 구해서 다 더해주면 되는 문제입니다.

 

문제는 GCD를 더한 값의 범위입니다.

 

테스트 케이스의 수 (n)가 1 ~ 100이고, 입력으로 주어지는 수는 1 ~ 1000000이다.

 

n개인 수를 2개씩 짝지어 만드는 모든 경우의 수는 n(n-1)/2 이므로, 100*99/2 = 4950이다.

 

만약 각각의 n이 1000000이라면 총 합의 최대 범위는 49억이 된다.

 

이는 int형의 표현 범위를 벗어나므로 자바에서는 long을 써줘야한다.

 


2. 코드

import java.util.*;

public class Main {

    public static int GCD(int a, int b){
        if(b == 0)
            return a;
        return GCD(b, a%b);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int t = sc.nextInt();

        while(t-- > 0 ){
            long result = 0; // int면 범위 초과.
            int[] nums = new int[101];
            int n = sc.nextInt();

            for(int i = 0; i < n; i++){
                nums[i] = sc.nextInt();
            }

            for(int i = 0; i < n; i++){
                for(int j = i+1; j < n; j++){
                    result+=GCD(nums[i], nums[j]);
                }
            }
            System.out.println(result);
        }

        sc.close();
    }
}

댓글