자료구조와 알고리즘/문제풀기

백준 17087 - 숨바꼭질 6

now0204 2023. 4. 10. 22:40

 

 

-해결방법 

수빈이는 d나 -d로만 움직일 수 있고, 동생들은 자유로운 위치에 있다.

동생이 어떤 위치에 있을 때 D씩 움직여서 잡으려면, 동생은 수빈이와 위치에서 D의 배수만큼 떨어진 자리에 있어야한다.

가령 수빈이가 2에 있고, 동생이 10에 있다면, 수빈이는 2씩 혹은 4씩 움직여야 10에 도달할 수 있다. D가 3이나 5면 수빈이는 절대 10에 갈 수 없을 것이다. 

즉 모든 동생들은 수빈이와의 위치와 차이에서 D의 배수만큼의 위치에 있어야 수빈이가 D씩 움직여서 모두 잡을 수 있다.

 

-1. 수빈이와 동생의 위치의 차이를 구한다.

-2. 위치의 차이들의 최대공약수를 구한다.

 

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] t = br.readLine().split(" ");

        int N = Integer.parseInt(t[0]);
        Long S = Long.parseLong(t[1]);
        String[] narr = br.readLine().split(" ");

        int gcd =0;
        if(N>1) {
            for (int i = 0; i < N - 1; i++) {
               
                int a = (int)Math.abs((Long.parseLong(narr[i])-S));
                int a2 = (int)Math.abs((Long.parseLong(narr[i + 1])-S));
                gcd = i == 0 ? getGCD(a,a2):getGCD(gcd,a2);
                //i가 0일때는 첫번째 수 a,a2 다음부터는 gcd와 다음 수의 최대공약수 

            }
        }else {gcd = (int)Math.abs(S-Integer.parseInt(narr[0]));}
        bw.write(gcd+"");
        bw.flush();
        bw.close();

    }

    private static int getGCD(int a, int b) {
        while(b != 0){
            int r = a % b;
            a= b;
            b = r;
        }
        return a;
    }

}

 

 

*N개의 최대공약수 gcd(gcd(a,b),c)