백준 숨바꼭질 6

KIMYEONGJUN·2025년 5월 16일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 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;
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글