
내가 생각했을때 문제에서 원하는부분
첫째 줄에 N(1 ≤ N ≤ 105)과 S(1 ≤ S ≤ 109)가 주어진다.
둘째 줄에 동생의 위치 Ai(1 ≤ Ai ≤ 109)가 주어진다.
동생의 위치는 모두 다르며, 수빈이의 위치와 같지 않다.
가능한 D값의 최댓값을 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader와 StringTokenizer를 사용하여 입력을 받는다.
gcd 메소드는 두 수의 최대공약수를 계산하는 유클리드 호제법을 구현한 것이다.
문제의 제약 조건상 int로도 충분할 수 있으나, 안전성을 위해 long 타입을 사용한다.
main 메소드에서는 N과 S를 읽고, 첫 번째 동생의 위치와의 차이 |A1 - S|를 계산하여 resultGCD 변수에 저장한다.
나머지 동생들에 대해 반복문을 실행하며, 각 동생 위치와의 차이 |Ai - S|와 현재 resultGCD 값의 최대공약수를 계산하여 resultGCD를 갱신한다.
만약 resultGCD가 1이 되면, 모든 차이의 최대공약수는 1 이하가 될 수 없으므로 1이 최댓값이 되며, 더 이상의 계산은 무의미하므로 반복을 즉시 종료한다.
마지막으로 최종 계산된 resultGCD 값을 출력한다.
코드로 구현
package baekjoon.baekjoon_28;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.lang.Math;
// 백준 17087번 문제
public class Main1023 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// 첫 번째 줄에서 N과 S를 읽습니다.
int N = Integer.parseInt(st.nextToken());
int S = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
// 첫 번째 동생 위치와의 차이를 계산하여 초기 최대공약수 후보로 설정합니다.
long diff = Math.abs((long)Integer.parseInt(st.nextToken()) - S);
long resultGCD = diff;
// 두 번째 동생부터 마지막 동생까지 반복하며 최대공약수를 갱신합니다.
for (int i = 1; i < N; i++) {
diff = Math.abs((long)Integer.parseInt(st.nextToken()) - S);
resultGCD = gcd(resultGCD, diff);
// 만약 최대공약수가 1이 되었다면, 더 이상 큰 값은 나올 수 없으므로 반복을 중단합니다.
if (resultGCD == 1) {
break;
}
}
// 계산된 최대공약수를 출력합니다.
System.out.println(resultGCD);
br.close();
}
// 최대공약수(GCD) 계산을 위한 유클리드 호제법
// long 타입을 사용하여 더 큰 숫자도 처리할 수 있도록 합니다.
public static long gcd(long a, long b) {
while (b != 0) {
long temp = b;
b = a % b;
a = temp;
}
return a;
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.