https://www.acmicpc.net/problem/9613
import java.io.*;
// 9613번 GCD 합
public class boj_1_9613 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int t = Integer.parseInt(br.readLine());
while (t-- > 0) {
String[] inputs = br.readLine().split(" ");
int n = Integer.parseInt(inputs[0]);
int[] arr = new int[n];
long answer = 0;
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt((inputs[i + 1]));
}
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
answer += gcd(arr[i], arr[j]);
}
}
bw.write(answer + "\n");
}
bw.flush();
bw.close();
}
public static int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
}
알아야 할 것
기본적으로 최대공약수를 구하는 방법을 알아야한다.
그리고 answer의 타입을 처음에 int로 하면 틀리게 되는데 그 이유는 테스트케이스의 값을 고려했을 때 int의 범위를 초과하므로 long 타입으로 지정해줘야한다. 왜 long을 해야하는지는 아래 자세하게 설명하겠다.
1. GCD 구하는 법
유클리드 호제법을 통해 최소공배수와 최대공약수를 구할 수 있다.
최대공약수란 어떤 두 수가 존재할 때 공통인 약수 중 가장 큰수
(최대공배수란 어떤 두 수가 존재할 때 그들의 배수가 되는 가장 작은 수)
2. GCD를 더한 값의 범위
테스트케이스의 수(n)가 1~100이고, 입력으로 주어지는 수 1~1,000,000이다.
n개의 수를 2개씩 짝지어 만드는 모든 경우의 수는 n(n-1)/2이므로 , 100*99/2=4950인데 만약 각각 n이 1,000,000이라면 총 합의 최대 범위는 49억이 된다.
int의 범위는 약 21억까지이고 49억은 int의 범위를 초과하므로 long으로 바꿔줘야한다.
참고
https://wonit.tistory.com/411
https://binghedev.tistory.com/59
http://tcpschool.com/java/java_datatype_basic