Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

JAVA Developer Training

22. 17087번 숨바꼭질6 본문

백준 알고리즘

22. 17087번 숨바꼭질6

Romenest 2021. 10. 5. 14:20

문제가 알아듣기 힘들었는데 간단히 설명하면

수빈이는 X+D, X-D만큼 움직일수있다.

 

첫번째 입력받는 n은 동생의 수

두번째 입력받는 S는 수빈이의 위치

세번째 입력받는 수들은 동생(들)의 위치

 

출력되어야 하는 수 D는 수빈이의 한번 움직일때의 발걸음 수

 

이 문제는 수빈이와 동생(들)의 위치사이의 거리를 구해 각 위치들을 모두 만날수 있는 수를 찾으라는 문제이다.

예제 2번을 예시로 든다면

S(수빈이의 위치) 81 과 동생(들)의 위치 33, 105, 57 사이의 거리를 구한다.

동생들의 위치는 수빈이의 위치보다 작거나 클수 있기때문에 해당 거리를 구하기 위해서는 절대값을 이용한다.

나온 거리는 48, 24, 24 가 되겠고 이 수들을 모두 걸칠수 있는 수빈이의 발걸음 수 들 중 가장 큰 수를 구하면 그것이 정답이 된다. 즉, 최대 공약수를 구하라는 말이 되겠다.

 

1. 우선 수빈이와 동생들간의 거리를 구한다 [절대값 이용]

2. 해당 수들의 최대공약수를 구한다.

 

 

0. 기본 설정

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

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int N = Integer.parseInt(st.nextToken());
        int S = Integer.parseInt(st.nextToken());

첫 입력받는 두 숫자를 토큰화 시켜 각각 N과 S로 정의한다

 

int[] arr = new int[N];
st = new StringTokenizer(br.readLine(), " ");

배열 arr는 동생들의 수만큼의 크기를 가진다.

또한 동생들을 각각 배열안에 넣기위해 토큰화를 한다

for (int i = 0; i < N; i++) {
	arr[i] = Integer.parseInt(st.nextToken());
}

토큰화 후 배열에 반복문으로 넣어준다. arr[i] 는 동생들의 수만큼 크기를 가지고있고

위 반복문을 통해 동생들의 위치를 넣어 준다

 

1-1. 수빈이와 동생들간의 거리를 구한다.

int distance = Math.abs(arr[0] - S);

Math.abs는 () 에 들어갈 수의 절대값을 표현해준다 

ex) Math.abs(-1) = 1 , Math.abs(1) = 1

 

1-2. 동생이 한명일땐 위와 같은 식을 쓰면되지만 여러명일땐 반복문을 써준다 따라서

 if (N > 1) {
    for (int i = 1; i < N; i++) {
    distance = GCD(distance, Math.abs(arr[i] - S));
    }
}

이 경우는 동생이 2명이상 이기에 최대 공약수를 구해야한다.

 

2. 각 수들의 최대공약수를 구한다.

public static int GCD(int a, int b) {
    if (a == 0) {
    return b;
    } else {
    return GCD(b % a, a);
    }
}

두수의 최대공약수를 구하는식

 

3. 코드전문

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class training {

    public static int GCD(int a, int b) {
        if (a == 0) {
            return b;
        } else {
            return GCD(b % a, a);
        }
    }

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

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int N = Integer.parseInt(st.nextToken());
        int S = Integer.parseInt(st.nextToken());
        int[] arr = new int[N];

        st = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        //동생이 한명일 경우
        int distance = Math.abs(arr[0] - S);

        //동생이 한명보다 많을경우 최대공약수 찾기
        if (N > 1) {
            for (int i = 1; i < N; i++) {
                distance = GCD(distance, Math.abs(arr[i] - S));
            }
        }
        bw.write(String.valueOf(distance));

        bw.flush();
        bw.close();
    }
}

 

결과

 

 

 

 

 

'백준 알고리즘' 카테고리의 다른 글

24. 2133번 타일 채우기  (0) 2021.10.05
23. 2225번 합분해  (0) 2021.10.05
21. 6588번 골드바흐의 추측  (0) 2021.09.27
20. 1929번 소수 구하기  (0) 2021.09.27
19. 11656번 접미사 배열  (0) 2021.09.27