본문 바로가기
Algorithm/BOJ

[BOJ]17087번: 숨바꼭질 6(java, c++)

by HBGB 2019. 9. 23.

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

 

17087번: 숨바꼭질 6

수빈이는 동생 N명과 숨바꼭질을 하고 있다. 수빈이는 현재 점 S에 있고, 동생은 A1, A2, ..., AN에 있다. 수빈이는 걸어서 이동을 할 수 있다. 수빈이의 위치가 X일때 걷는다면 1초 후에 X+D나 X-D로 이동할 수 있다. 수빈이의 위치가 동생이 있는 위치와 같으면, 동생을 찾았다고 한다. 모든 동생을 찾기위해 D의 값을 정하려고 한다. 가능한 D의 최댓값을 구해보자.

www.acmicpc.net

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.io.*;
import java.util.StringTokenizer;
 
public class Main {
    public static void main(String[] args) {
 
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
 
            int iSisNum = Integer.parseInt(st.nextToken());
            int iOrigin = Integer.parseInt(st.nextToken());
 
            st = new StringTokenizer(br.readLine());
 
            int[] arrAbsNums = new int[iSisNum];
            
            for (int i = 0; i < iSisNum; i++) {
                arrAbsNums[i] = Math.abs(iOrigin - Integer.parseInt(st.nextToken()));
            }
            
            int iGCD = Math.abs(arrAbsNums[0]);
            
            for (int i = 1; i < iSisNum; i++) {
                iGCD = GCD(iGCD, arrAbsNums[i]);
            }
            
            System.out.println(iGCD);
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public static int GCD(int A, int B) {
 
        if (B == 0) {
            return A;
        } else {
            return GCD(B, A % B);
        }
    }
}
Colored by Color Scripter

 

c++ 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <vector>
 
using namespace std;
 
int GCD(int a, int b)
{
    if (b == 0)
    {
        return a;
    }
    return GCD(b, a % b);
}
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    int N, S;
    cin >> N >> S;
 
    // 동생과 수빈이의 위치 차이를 저장
    vector<int> sister_gap(N);
    for (int i = 0; i < N; i++)
    {
        cin >> sister_gap[i];
        sister_gap[i] = (S - sister_gap[i] > 0) ? S - sister_gap[i] : sister_gap[i] - S;
    }
 
    // 개별 차이값들의 최대공약수 계산
    int gcd = sister_gap[0];
    for (int i = 1; i < N; i++)
    {
        gcd = GCD(gcd, sister_gap[i]);
    }
 
    cout << gcd;
 
    return 0;
}
Colored by Color Scripter

 

 

TIP

D씩 이동할 수 밖에 없으므로, |수빈 - 동생| 값들의 GCD를 구하는 문제

 

1. 절대값들을 먼저 모두 구하여 배열로 저장하고 난 후,

2. 배열 요소들의 GCD를 구하자

 

댓글