1 λΆ„ μ†Œμš”

πŸ“ [S2_2644] μ΄Œμˆ˜κ³„μ‚°

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

public class Main {
    static StringTokenizer st;
    static int[][] arr;
    static boolean[][] v;
    static int cnt, res;
    static int n;
    static int res_start, res_end;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // 전체 μ‚¬λžŒμ˜ 수
        n = Integer.parseInt(br.readLine());

        st = new StringTokenizer(br.readLine(), " ");

        // κ³„μ‚°ν•΄μ•Όν•˜λŠ” 촌수
        res_start = Integer.parseInt(st.nextToken());
        res_end = Integer.parseInt(st.nextToken());

        // κ΄€κ³„μ˜ 개수
        int m = Integer.parseInt(br.readLine());

        arr = new int[n+1][n+1];

        v = new boolean[n+1][n+1];

        res  = 0;

        for(int i=0; i<m; i++){
            st = new StringTokenizer(br.readLine(), " ");

            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            arr[start][end] = arr[end][start] = 1;
        }

        dfs(res_start);


        if(res == 0){
            sb.append(-1);
        }
        else {
            sb.append(res);
        }
        System.out.println(sb);

    }

    static void dfs(int start){
        // κΈ°μ € 쑰건
        if(start == res_end){
            res = cnt;
            return;
        }

        for(int i=1; i<n+1; i++){
            if(arr[start][i] == 1 && !v[start][i]){
                // 방문 처리
                v[start][i] = v[i][start] = true;
                cnt++;
                dfs(i);
                cnt--;
            }
        }
    }
}

πŸ€” λ‚˜μ˜ 생각

이 λ¬Έμ œλŠ” 처음 보고 μ§‘ν•©μœΌλ‘œ ν’€μ–΄μ•Ό ν•˜λ‚˜ 라고 생각을 ν–ˆλŠ”λ° 트리λ₯Ό κ·Έλ €λ³΄λ‹ˆ μœ„λŠ” 1촌 이고 μ˜†μ€ 2촌인데 μ˜†λ„ κ²°κ΅­ 펼쳐보면 μœ„λ‘œ ν•œ μΉΈ κ°”λ‹€κ°€ λ‹€μ‹œ λ°‘μœΌλ‘œ κ°€λŠ” κ±°μ—¬μ„œ κ·Έλƒ₯ 경둜의 길이λ₯Ό ꡬ해주면 λ˜λŠ” κ²ƒμ΄μ˜€λ‹€.
κ·Έλž˜μ„œ dfs μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•΄μ„œ 깊이 μš°μ„  탐색을 ν•΄μ£Όμ—ˆλ‹€.
그리고 λ°©ν–₯성이 μ—†κΈ° λ•Œλ¬Έμ— μž…λ ₯을 받을 λ•Œ μ–‘ λ°©ν–₯ λ‹€ ν•΄μ£Όμ—ˆλ‹€.
λ¬Έμ œμ—μ„œ 경둜의 길이λ₯Ό κ΅¬ν•΄μ•Όν•˜λŠ” 것을 μ•ˆλ‹€λ©΄ 어렡지 μ•Šκ²Œ κ΅¬ν˜„ν•  수 μžˆμ—ˆμ„ κ±°λ‹€.