베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

17616번: 등수 찾기

2022. 5. 1. 23:30

https://www.acmicpc.net/problem/17616

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

public class java_17616 {
    // 나를 가리키는 adj 추가
    // 내가 가리키는 adj 추가
    static Vector<Vector<Integer>> adjFrom;
    static Vector<Vector<Integer>> adjTo;

    static int N, M, X;

    static class Pair {
        int u, v;

    }

    public static Pair bfs(int start) {
        Pair result = new Pair();

        int count = 0;

        boolean isVisited[] = new boolean[N];

        Queue<Integer> queue = new LinkedList<>();

        queue.add(start);
        isVisited[start] = true;

        // 내가 가리키는 == 내가 이기는
        while (!queue.isEmpty()) {
            int thisPoint = queue.poll();

            for (int i = 0; i < adjTo.get(thisPoint).size(); i++) {
                int nextPoint = adjTo.get(thisPoint).get(i);
                if (isVisited[nextPoint]) {
                    continue;
                }

                queue.add(nextPoint);
                isVisited[nextPoint] = true;
            }
            count++;
        }

        result.v = N - count + 1;

        count = 0;
        queue.add(start);
        // 나를 가리키는 == 내가 지는
        while (!queue.isEmpty()) {
            int thisPoint = queue.poll();

            for (int i = 0; i < adjFrom.get(thisPoint).size(); i++) {
                int nextPoint = adjFrom.get(thisPoint).get(i);
                if (isVisited[nextPoint]) {
                    continue;
                }

                queue.add(nextPoint);
                isVisited[nextPoint] = true;
            }
            count++;
        }

        result.u = count;

        return result;
    }

    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());

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        X = Integer.parseInt(st.nextToken());

        // N명 만큼 인접리스트 추가
        adjTo = new Vector<>();
        adjFrom = new Vector<>();
        for (int i = 0; i < N; i++) {
            adjTo.add(new Vector<>());
            adjFrom.add(new Vector<>());
        }

        // 데이터 입력
        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int from = Integer.parseInt(st.nextToken()) - 1;
            int to = Integer.parseInt(st.nextToken()) - 1;

            adjTo.get(from).add(to);
            adjFrom.get(to).add(from);
        }

        Pair result = bfs(X - 1);

        bw.write(result.u + " " + result.v + "\n");

        br.close();
        bw.close();
    }
}

'Coding Test > BOJ' 카테고리의 다른 글

2251번: 물통  (0) 2022.05.10
17391번: 무한부스터  (0) 2022.05.01
6539번: 상범 빌딩  (0) 2022.05.01
2638번: 치즈  (0) 2022.04.16
1647번: 도시 분할 계획  (0) 2022.04.16
    'Coding Test/BOJ' 카테고리의 다른 글
    • 2251번: 물통
    • 17391번: 무한부스터
    • 6539번: 상범 빌딩
    • 2638번: 치즈
    베오
    베오

    티스토리툴바