아가개발자/자료구조,알고리즘

[Java/자바][백준17087: 숨바꼭질6]

율쟝 2021. 8. 8. 19:14

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

 

17087번: 숨바꼭질 6

수빈이는 동생 N명과 숨바꼭질을 하고 있다. 수빈이는 현재 점 S에 있고, 동생은 A1, A2, ..., AN에 있다. 수빈이는 걸어서 이동을 할 수 있다. 수빈이의 위치가 X일때 걷는다면 1초 후에 X+D나 X-D로 이

www.acmicpc.net

Problem

수빈이는 동생 N명과 숨바꼭질을 하고 있다. 수빈이는 현재 점 S에 있고, 동생은 A1, A2, ..., AN에 있다.

수빈이는 걸어서 이동을 할 수 있다. 수빈이의 위치가 X일때 걷는다면 1초 후에 X+D나 X-D로 이동할 수 있다. 수빈이의 위치가 동생이 있는 위치와 같으면, 동생을 찾았다고 한다.

모든 동생을 찾기위해 D의 값을 정하려고 한다. 가능한 D의 최댓값을 구해보자.

 

Input

첫째 줄에 N(1 ≤ N ≤ 105)과 S(1 ≤ S ≤ 109)가 주어진다. 둘째 줄에 동생의 위치 Ai(1 ≤ Ai ≤ 109)가 주어진다. 동생의 위치는 모두 다르며, 수빈이의 위치와 같지 않다.

 

Output

가능한 D값의 최댓값을 출력한다.

 

Insight

1. 수빈이의 위치에서 동생들의 위치에서 가기 위한 최대 D값은 최대 공약수로 결정할 수 있다. 

 ex) 수빈이 위치 3, 동생들의 위치 1, 7, 11  -> 수빈이의 위치에서 동생들의 위치를 가기 위해 필요한 값은 각각 |3-1|, |3-7|, |3-11| = 2, 4, 8 이다. 

하나의 값으로 모든 위치를 가기 위한 최대값은 2,4,8,의 최대 공약수 2가 된다.  

 

<Process> 
1. | S-A1 | 부터 | S-AN| 까지 반복문으로 최대공약수를 찾는다. 
import java.util.*;
import java.io.*;

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

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " "); 
		int N = Integer.parseInt(st.nextToken());
		int S = Integer.parseInt(st.nextToken());
		int[] arr = new int[N]; 
		
		st = new StringTokenizer(br.readLine(), " ");
		for(int i=0; i<N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		int gcd = Math.abs(arr[0] - S); 
		
		if(S>1) {
			for(int i=1; i<N; i++) {
				gcd = GCD(gcd, Math.abs(arr[i]-S)); 
			}
		}
		bw.write(String.valueOf(gcd));
		
		bw.flush();
		bw.close();
	}
}