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를 구하자
'Algorithm > BOJ' 카테고리의 다른 글
| [BOJ]1212번: 8진수 2진수(java, c++) (0) | 2019.09.23 | 
|---|---|
| [BOJ]1373번: 2진수 8진수(java, c++) (0) | 2019.09.23 | 
| [BOJ]9613번: GCD 합(java, c++) (0) | 2019.09.23 | 
| [BOJ]2004번: 조합 0의 개수(java, c++) (0) | 2019.09.21 | 
| [BOJ]1676번: 팩토리얼 0의 개수 (0) | 2019.09.21 | 
 
										
									
댓글