[백준, 자바] 11653번 - 숨바꼭질 6

jinvicky·2024년 4월 21일
0

ALG

목록 보기
31/62
post-thumbnail

현재 풀고 있는 시리즈
https://code.plus/course/41

import java.io.*;
import java.util.Stack;
import java.util.StringTokenizer;


public class Main {

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

        StringTokenizer st = new StringTokenizer(br.readLine());
        int countOfBrother = Integer.parseInt(st.nextToken()); // 동생 수
        int myPosition = Integer.parseInt(st.nextToken()); // 내 위치

        Stack<Integer> stack = new Stack<>();

        int currentPos = myPosition; // 수빈이의 현재 위치
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < countOfBrother; i++) {
            int posOfBrother = Integer.parseInt(st.nextToken());
            // 현재 내 위치 - 동생의 위치를 구한다. (-가 나오지 않도록 절댓값 메서드를 쓴다)
            int distanceDiff = Math.abs(currentPos - posOfBrother);

            stack.push(distanceDiff); // 스택에 거리차 값을 계속 push한다.
            currentPos = posOfBrother; // 수빈이가 동생한테 갔으니 동생 위치로 현재 위치를 바꾼다.
        }

        int gcdResult = 0;

        if (countOfBrother == 1) {
            gcdResult = stack.pop();
        } else if (countOfBrother == 2) {
            gcdResult = recursiveGcd(stack.pop(), stack.pop());
        } else {
            // 동생이 3명 이상인 경우
            int temp = recursiveGcd(stack.pop(), stack.pop());
            while (!stack.isEmpty()) {
                temp = recursiveGcd(temp, stack.pop());
            }
            gcdResult = temp;
        }
        System.out.println(gcdResult);
    }
    public static int gcd (int v1, int v2) {
        while (v2 != 0) {
            int tmp = v1;
            v1 = v2;
            v2 = tmp % v2;
        }
        return v1;
    }

    public static int recursiveGcd (int v1, int v2) {
        int tmp = v1;
        if (v2 == 0) {
            return v1;
        }
        return recursiveGcd(v2, tmp % v2); // b(v2)가 0이 아니면 재귀호출
    }
}

결과
문제 해석 못해서 오답

나는 수빈이 기준으로 동생들 사이의 거리를 가지고 계산하는 줄 알았는데,
수빈이가 첫번째 동생부터 차례로 각 동생들 위치로 가면서 계산을 해야 한다.

수빈이가 3에서 1에 있는 동생한테 가면 수빈이 위치는 1이 된다.
거기서 또 다른 동생한테 가는 데까지의 소요 거리를 계산하는 것이다.

마지막으로 최대공약수를 구할때 동생의 수가 1명부터 n명인데 이것을 어떻게 분기처리할지 고민을 많이 했다.
stack을 써서 낑낑대다가 화딱지가 나서 그냥 동생이 1명일 때, 2명일 때, 3명 이상일 때 분기처리를 했다.

  • 1명이면 그냥 절댓값(수빈이 위치 - 동생의 위치)를 반환한다.
  • 2명이면 gcd ((수빈 - 1번째 동생) , (수빈 - 2번째 동생)) 식으로 계산한다.
  • 3명이면 먼저 2명의 최대공약수를 구해서 temp에 저장을 하고, stack에서 1명씩 꺼내서 temp랑 재귀로 gcd()를 돌린다.

재귀 좀 못해서 처음에 while 반복문으로 했다가 재귀 구조로 고쳤다.

후기
문제 이해력이 심각하다;;; 한 2-2.5시간 걸림.

Reference


https://kimhaksung.tistory.com/entry/python3GCD
https://adjh54.tistory.com/182

profile
일단 쓰고 본다

1개의 댓글

comment-user-thumbnail
2024년 4월 21일

if(N==1){
answer = arr[0];
}
else {
answer = arr[0];
for(int i=1; i<N; i++){
gcd(answer, arr[i]);
}
}
System.out.println(answer);

3가지가 아니라 2가지 케이스로 분기처리하는 경우 가능함.
위의 경우는 배열을 쓴 경우다.

답글 달기