์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

๋ฐฑ์ค€ 10159๋ฒˆ - ์ €์šธ

giraffe_ 2023. 10. 22. 22:46

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

 

10159๋ฒˆ: ์ €์šธ

์ฒซ ์ค„์—๋Š” ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜ N ์ด ์ฃผ์–ด์ง€๊ณ , ๋‘˜์งธ ์ค„์—๋Š” ๋ฏธ๋ฆฌ ์ธก์ •๋œ ๋ฌผ๊ฑด ์Œ์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹จ, 5 ≤ N ≤ 100 ์ด๊ณ , 0 ≤ M ≤ 2,000์ด๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์— ๋ฏธ๋ฆฌ ์ธก์ •๋œ ๋น„๊ต ๊ฒฐ๊ณผ๊ฐ€ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ

www.acmicpc.net

 

 

 

 

 

๋ฌธ์ œ

  • ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜ N ๊ณผ ์ผ๋ถ€ ๋ฌผ๊ฑด ์Œ์˜ ๋น„๊ต ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ ๋ฌผ๊ฑด์— ๋Œ€ํ•ด์„œ ๊ทธ ๋ฌผ๊ฑด๊ณผ์˜ ๋น„๊ต ๊ฒฐ๊ณผ๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅ
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด 6๊ฐœ์˜ ๋ฌผ๊ฑด์ด ์žˆ๊ณ , ๋‹ค์Œ 5๊ฐœ์˜ ๋น„๊ต ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ([1]์€ 1๋ฒˆ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.)
  • [1]>[2], [2]>[3], [3]>[4], [5]>[4], [6]>[5]
  • ์šฐ๋ฆฌ๋Š” [2]>[3], [3]>[4]๋กœ๋ถ€ํ„ฐ [2]>[4]๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ฌผ๊ฑด 2์™€ ๋ฌผ๊ฑด 6์„ ๋น„๊ตํ•˜๋Š” ๊ฒฝ์šฐ, ์•ž์„œ์˜ ๊ฒฐ๊ณผ๋งŒ์œผ๋กœ๋Š” ์–ด๋А ๊ฒƒ์ด ๋ฌด๊ฑฐ์šด์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. ์ด์™€ ๊ฐ™์ด, ๋ฌผ๊ฑด 2๋Š” ๋ฌผ๊ฑด 1, 3, 4์™€์˜ ๋น„๊ต ๊ฒฐ๊ณผ๋Š” ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฌผ๊ฑด 5, 6๊ณผ์˜ ๋น„๊ต ๊ฒฐ๊ณผ๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค. ๋ฌผ๊ฑด 4๋Š” ๋ชจ๋“  ๋‹ค๋ฅธ ๋ฌผ๊ฑด๊ณผ์˜ ๋น„๊ต ๊ฒฐ๊ณผ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

ํ’€์ด

์–ด๋– ํ•œ ๋‘ ๊ฐœ์˜ ์ˆœ์„œ๋ฅผ ๋น„๊ตํ•ด ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ชจ๋“  ์›์†Œ ๊ฐ„์˜ ์ˆœ์„œ ๊ด€๊ณ„๋ฅผ ์•Œ์•„๋‚ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋กœ ์ด์ „์— ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์—์„œ ํ’€์—ˆ๋˜ '์ˆœ์œ„'์™€ ๋น„์Šทํ•œ ์œ ํ˜•์˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ’€์ด๋ฒ•์„ ๋ฐ”๋กœ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์—ˆ๋‹ค.

https://school.programmers.co.kr/learn/courses/30/lessons/49191

 

 

 

  • ๊ทธ๋ž˜ํ”„์˜ ์ž๋ฃŒ๊ตฌ์กฐ : ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

 A > B์˜ ์ˆœ์„œ ๊ด€๊ณ„๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ์ด์–ด์„œ B > C๊ฐ€ ์ฃผ์–ด์ง€๋ฉด  A > B > C๋กœ ๊ด€๊ณ„๊ฐ€ ์—ฐ๊ฒฐ๋˜๋ฏ€๋กœ ์ด๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ์—๋Š” 2์ฐจ์› ๋ฐฐ์—ด์˜ ๊ทธ๋ž˜ํ”„๋ณด๋‹ค๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ ํ•ฉํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž…๋ ฅ์ด  5 ≤ N ≤ 100์ด๊ณ , 0 ≤ M ≤ 2,000์ด๋ฏ€๋กœ ๊ณต๊ฐ„๋ณต์žก๋„ ์ธก๋ฉด์—์„œ๋„ ํšจ์œจ์ ์ด๋‹ค. 2์ฐจ์› ๋ฐฐ์—ด์˜ ๊ทธ๋ž˜ํ”„๋กœ ํ‘œํ˜„ํ•œ๋‹ค๋ฉด 100 * 100 = 10,000์œผ๋กœ ๋น„๊ต ๊ฒฐ๊ณผ(M)์˜ ์ตœ๋Œ€์น˜์ธ 2,000์„ ํ›จ์”ฌ ๋„˜๋Š”๋‹ค.

 

 

 

  • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ : BFS

 ๋ฌผ๊ฑด๊ณผ์˜ ๋น„๊ต ๊ฒฐ๊ณผ๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋Œ€๋กœ ๋ฌผ๊ฑด๊ณผ์˜ ๋น„๊ต ๊ฒฐ๊ณผ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ์•„๋‚ด์•ผ ํ•œ๋‹ค. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— A > B๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ํ•ด๋‹น ๋ฌผ๊ฑด์„ ์‹œ์ž‘์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ํ•œ๋‹ค๋ฉด ์ž์‹ ๋ณด๋‹ค ๊ฐ€๋ฒผ์šด ๋ฌผ๊ฑด๋“ค์˜ ๋ฒˆํ˜ธ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 BFS(๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰)์„ ํ†ตํ•ด ํ์— ๋‹ด๊ฒจ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋˜๋Š” ์›์†Œ๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•ด ์ข…๋ฃŒ๋  ๋•Œ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ–ˆ๋‹ค.

 

 

 

  • ์–‘๋ฐฉํ–ฅ์˜ ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐœ์˜ ๊ทธ๋ž˜ํ”„

 ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜๋กœ ๋‘์–ด A > B์˜ ๊ด€๊ณ„๋งŒ ์ €์žฅ์„ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ์ž์‹ ๋ณด๋‹ค ๊ฐ€๋ฒผ์šด ์›์†Œ๋“ค๋งŒ ์•Œ ์ˆ˜ ์žˆ์„ ๋ฟ, ๋ฌด๊ฑฐ์šด ์›์†Œ๋“ค์€ ์•Œ์ง€ ๋ชปํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ”„์— ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด A > B, A > C์ธ ๊ฒฝ์šฐ, B๋ฅผ ์‹œ์ž‘์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๊ด€๊ณ„๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” C๋„ ํƒ์ƒ‰์„ ํ•ด ์ˆœ์„œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

 

 ๊ทธ๋ž˜์„œ ์ž์‹ ๋ณด๋‹ค ๋ฌด๊ฑฐ์šด ์›์†Œ๋“ค๋งŒ ํƒ์ƒ‰ํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋ฐ˜๋Œ€์˜ ๊ด€๊ณ„์ธ B < A๋ฅผ ์ €์žฅํ•˜๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ๋„ ํ•ด๋‹น ๋ฌผ๊ฑด์„ ์‹œ์ž‘์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ํ•˜์—ฌ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋˜๋Š” ์›์†Œ๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•˜๊ณ , ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ์— ๋”ํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class Main {
	static ArrayList<Integer>[] graph1; //์ธ์ ‘๋ฆฌ์ŠคํŠธ: ๊ด€๊ณ„ ์ €์žฅ(A > B)
    static ArrayList<Integer>[] graph2; //๋ฐ˜๋Œ€๋กœ ์ €์žฅ(B < A)
    static boolean[] visited;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		int M = Integer.parseInt(br.readLine());
		
		graph1 = new ArrayList[N + 1];
        for(int i = 1; i < N + 1; i++) {
            graph1[i] = new ArrayList<>();
        }
        
        graph2 = new ArrayList[N + 1];
        for(int i = 1; i < N + 1; i++) {
            graph2[i] = new ArrayList<>();
        }
        
        for(int i = 0; i < M; i++) { //๋ฌผ๊ฑด ๋น„๊ต ์ •๋ณด ์ €์žฅ
        	StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        	int a = Integer.parseInt(st.nextToken());
        	int b = Integer.parseInt(st.nextToken());
        	
        	graph1[a].add(b); //A > B
            graph2[b].add(a); //B < A
        }
        
        //๊ตฌํ˜„
        int[] answer = new int[N + 1];
        
        for(int i = 1; i < N + 1; i++) {
        	visited = new boolean[N + 1];
        	int sum = bfs(graph1, i); //i๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ฑด ๊ฐœ์ˆ˜(iํฌํ•จ)
        	
        	visited = new boolean[N + 1];
        	sum += bfs(graph2, i); //i๋ณด๋‹ค ํฐ ๋ฌผ๊ฑด ๊ฐœ์ˆ˜(iํฌํ•จ)
        	
        	answer[i] = N - sum - 1; //๋น„๊ต ๊ฒฐ๊ณผ๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜
        }
        
        //์ถœ๋ ฅ
        StringBuilder sb = new StringBuilder();
        for(int i = 1; i < N + 1; i++) {
        	sb.append(answer[i] + "\n");
        }
        System.out.println(sb);
	}
	
	public static int bfs(ArrayList<Integer>[] graph, int v) {
        Queue<Integer> queue = new LinkedList<>();
         
        queue.add(v);
        visited[v] = true;
         
        int count = 0; //๋น„๊ต ๊ฐ€๋Šฅ ๋ฌผ๊ฑด ๊ฐœ์ˆ˜
        while(!queue.isEmpty()) {
            int p = queue.poll();
             
            for(int i : graph[p]) {
                if(!visited[i]) {
                    queue.add(i);
                    visited[i] = true;
                    count++;
                }
            }
        }
         
        return count;
    }

}

 

 

 

 

 

๊ฒฐ๊ณผ

 

 

 

 

๋ฐฐ์šด์ 