본문 바로가기
Problem Solving/Baekjoon

[백준] 21316 스피카 - Graph Theory / Java

by graycode 2023. 10. 13.

 문제 링크

 

21316번: 스피카

위 그림은 처녀자리 중 12개의 별을 12개의 선분으로 이어 만든 그림이다. 시은이는 임의로 각 별에 1부터 12까지의 서로 다른 정수 번호를 부여하고, 12개의 정수 쌍으로 각 선분이 어떤 두 별을

www.acmicpc.net

 

 풀이 코드

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;

public class Main {

    static Node[] graph = new Node[13];

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

        for (int i = 1; i <= 12; i++) graph[i] = new Node(i);

        for (int i = 0; i < 12; i++) {
            int u = read(), v = read();
            graph[u].addEdge(v);
            graph[v].addEdge(u);
        }

        bw.write(String.valueOf(findSpica()));
        bw.flush();
    }

    private static int findSpica() {
        for (int i = 1; i <= 12; i++) {
            Node node = graph[i];
            if (node.adj.size() == 3) {
                boolean a = false, b = false, c = false;
                for (int src : node.adj) {
                    if (graph[src].adj.size() == 1) a = true;
                    else if (graph[src].adj.size() == 2) b = true;
                    else if (graph[src].adj.size() == 3) c = true;
                }
                if (a && b && c) return node.src;
            }
        }

        return -1;
    }

    private static class Node {
        int src;
        List<Integer> adj;

        Node(int src) {
            this.src = src;
            this.adj = new ArrayList<>();
        }

        public void addEdge(int tgt) {
            adj.add(tgt);
        }
    }

    private static int read() throws IOException {
        int c, n = System.in.read() & 15;
        while ((c = System.in.read()) > 32) n = (n << 3) + (n << 1) + (c & 15);

        return n;
    }

}

댓글