문제
https://www.acmicpc.net/problem/2981
트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다.
상근이는 시간을 때우기 위해서 수학 게임을 하기로 했다.
먼저 근처에 보이는 숫자 N개를 종이에 적는다. 그 다음, 종이에 적은 수를 M으로 나누었을 때, 나머지가 모두 같게 되는 M을 모두 찾으려고 한다. M은 1보다 커야 한다.
N개의 수가 주어졌을 때, 가능한 M을 모두 찾는 프로그램을 작성하시오.
풀이
나머지가 같다는 걸 수식으로 생각해보면 다음과 같다.
A1 = M*Q1 + R1
A2 = M*Q2 + R2
라는 식이 있을 때
A1 - A2 = M*Q1 - M*Q2 + (R1-R2)
A1 - A2 = M(Q1 - Q2) (R1 = R2이므로 R1-R2=0)
로 나타낼 수 있다.
즉 M은 A1과 A2의 차의 공약수이다.
이를 구하기 위해서 둘의 최대공약수를 구한 후 이 최대공약수의 약수들을 구하면 된다!
최대공약수를 구하기 위해서 지난 문제들에서 사용했던 유클리드 호제법을 사용하였다.
코드
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int[]arr=new int[N];
for(int i=0;i<N;i++) {
arr[i]=sc.nextInt();
}
Arrays.sort(arr);
int num=arr[1]-arr[0];
for(int i=1;i<N;i++) {
num=gcd(num, arr[i]-arr[i-1]);
}
for(int i=2;i<=num;i++) {
if(num%i==0)
System.out.print(i+" ");
}
}
public static int gcd(int a, int b) {
if(b==0) return a;
else return gcd(b, a%b);
}
}
'알고리즘연습 > 백준' 카테고리의 다른 글
[백준] 정수론및조합론 - 11050번 이항계수1 java 자바 (0) | 2021.07.21 |
---|---|
[백준] 정수론및조합론 - 3036번 링 java 자바 (0) | 2021.07.19 |
[백준] 정수론및조합론 - 1934번 최소공배수 java 자바 (0) | 2021.07.15 |
[백준] 정수론 및 조합론 - 2609번 최대공약수와 최소공배수 (0) | 2021.07.13 |
[백준] 정수론 및 조합론 - 1037번 약수 java 자바 (0) | 2021.07.11 |