알고리즘

백준 17616번 등수 찾기 (JAVA)

박카스마시며코딩 2022. 5. 13. 10:40

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

 

17616번: 등수 찾기

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에 세 정수 N, M, X가 공백을 사이에 두고 주어진다. (2 ≤ N ≤ 105, 1 ≤ M ≤ min(N(N-1)/2, 5×105), 1 ≤ X ≤ N) . 다음 M 줄에는 각각 두 정수 A, B가 주어

www.acmicpc.net

 

저는 bfs를 이용해 문제를 해결하였습니다.

저는 x에게 이긴 사람의 수와 진 사람의 수를 각각 bfs를 이용해 찾았습니다.

x의 등수는 ( x에게 진 사람 수 + 1 ) ~ ( 전체 사람 수 - x에게 이긴 사람 수 ) 입니다. 

 

package BOJ.bfs;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_17616 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(st.nextToken());
        int m = stoi.apply(st.nextToken());
        int x = stoi.apply(st.nextToken());
        List<Integer>[] lose = new List[n+1];
        List<Integer>[] win = new List[n+1];
        for(int i = 1; i <= n ; i++){
            lose[i] = new LinkedList<>();
            win[i] = new LinkedList<>();
        }
        for(int i = 0 ;  i < m ; i++){
            st = new StringTokenizer(br.readLine()," ");
            int loser = stoi.apply(st.nextToken());
            int winner = stoi.apply(st.nextToken());
            lose[loser].add(winner);
            win[winner].add(loser);
        }
        int loserCnt = countPeople(x,lose,n);
        int winnerCnt = countPeople(x,win,n);
        System.out.println( winnerCnt +" "+ (n - loserCnt + 1) );
    }
    private static int countPeople(int num, List<Integer>[] map,int n){
        int cnt = 0;
        Queue<Integer> q = new LinkedList<>();
        boolean[] visited = new boolean[n+1];
        q.offer(num);
        visited[num] = true;
        while(!q.isEmpty()){
            int now = q.poll();
            cnt++;
            for(int next : map[now]){
                if(visited[next]){
                    continue;
                }
                visited[next] = true;
                q.offer(next);
            }
        }
        return cnt;
    }
}