알고리즘/백준

[백준] 2644. 촌수계산

hongeeii 2023. 11. 28.
728x90
반응형

Tree 구조를 사용해서 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.StringTokenizer;

public class Main {
    private static List<Node> list = new ArrayList<>();
    private static boolean[] visit;

    private static int N;
    private static int me;
    private static int outher;
    private static Node meNode;

    private static int count = 0;

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

        N = Integer.parseInt(br.readLine());
        visit = new boolean[N + 1];

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

        me = Integer.parseInt(st.nextToken());
        outher = Integer.parseInt(st.nextToken());

        int m = Integer.parseInt(br.readLine());

        for (int i = 0; i < m; i++) {
            StringTokenizer st2 = new StringTokenizer(br.readLine());
            childOf(Integer.parseInt(st2.nextToken()), Integer.parseInt(st2.nextToken()));
        }

        meNode = list.stream().filter(node -> node.data == me).findAny().get();

        dfs(meNode, 0);

        int answer = count == 0 ? -1 : count;
        System.out.println(answer);
    }


    private static void dfs(Node node, int depth) {
        if (node == null || visit[node.data]) {
            return;
        }

        visit[node.data] = true;
        List<Node> child = node.child;
        Node parent = node.parent;

        if (node.data == outher) {
            count = depth;
            return;
        }

        child.forEach(childNode -> {
            dfs(childNode, depth + 1);
        });

        dfs(parent, depth + 1);

    }


    static class Node {
        Node parent;
        List<Node> child = new ArrayList<>();
        int data;

        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "data::" + data;
        }
    }


    public static Node childOf(int parentData, int childData) {
        Optional<Node> optParentNode =
                list.stream().filter(node -> node.data == parentData).findAny();
        Optional<Node> optChildNode =
                list.stream().filter(node -> node.data == childData).findAny();

        Node parentNode = optParentNode.orElseGet(() -> {
            Node node = new Node();
            list.add(node);
            return node;
        });

        Node childNode = optChildNode.orElseGet(() -> {
            Node node = new Node();
            list.add(node);
            return node;
        });

        childNode.data = childData;
        childNode.parent = parentNode;


        parentNode.data = parentData;
        parentNode.child.add(childNode);


        return childNode;
    }
}
728x90
반응형

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

[백준] 2667. 단지번호붙이기  (1) 2023.11.27
[백준] N과M(10)  (0) 2023.04.11
[백준] N과M(9)  (0) 2023.04.11
[백준] N과M(8)  (0) 2023.04.10
[백준] N과M(7)  (0) 2023.04.10

추천 글