Hamutaro - Hamtaro 4

Algorithm/BOJ

[Silver II/JAVA] 24479, 24480 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ 1, 2

carsumin 2024. 12. 1. 00:10

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

 

 

  • ๋ฌธ์ œ์˜ ์กฐ๊ฑด
์ •์ ์˜ ์ˆ˜ : N
๊ฐ„์„ ์˜ ์ˆ˜ : M
์‹œ์ž‘ ์ •์  : R
์ธ์ ‘ ์ •์ ์€ ์˜ค๋ฆ„์ฐจ์ˆœ ๋ฐฉ๋ฌธ (24479๋ฒˆ ๋ฌธ์ œ)
์ธ์ ‘ ์ •์ ์€ ๋‚ด๋ฆผ์ฐจ์ˆœ ๋ฐฉ๋ฌธ (24480๋ฒˆ ๋ฌธ์ œ)

 

  • ํ•„์š”ํ•œ ๊ฒƒ
ArrayList (์ด์ฐจ์› Array๋Š” N*N์ด๋ผ ์‹œ๊ฐ„์ดˆ๊ณผ ๋ฐœ์ƒํ•จ) 
-> ์‹ค์ œ ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ๋งŒ ์ €์žฅํ•˜๋Š” ArrayList๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ

 

- ์ด์ฐจ์› ๋ฐฐ์—ด์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(N)

- ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(E), ์—ฌ๊ธฐ์„œ E๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜. ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜์™€ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋น„๋ก€ํ•œ๋‹ค.

 

  • ์ž…๋ ฅ๋ฐ›๊ธฐ
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");

int N = Integer.parseInt(str[0]); // ์ •์ ์˜ ์ˆ˜
int M = Integer.parseInt(str[1]); // ๊ฐ„์„ ์˜ ์ˆ˜
int R = Integer.parseInt(str[2]); // ์‹œ์ž‘ ์ •์ 

 

- Scanner๋ณด๋‹ค BufferedReader๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.

- BufferedReader๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜•๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋‹ค.

- ์ž…๋ ฅ์„ ๊ณต๋ฐฑ๋‹จ์œ„๋กœ ๋Š์–ด์„œ ์ŠคํŠธ๋ง ๋ฐฐ์—ด์— ๋‹ด์•„์„œ ์ฝ๋Š”๋‹ค.

 

  • visited ๋ฐฐ์—ด, graph ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ
// ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
visited = new int[N + 1];

// ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
for (int i = 0; i < N + 1; i++) {
    graph.add(new ArrayList<>());
}

 

- ๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด '์ •์  ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N ๋ฒˆ...' ์ด๋ผ๊ณ  ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๋ฅผ 1๋ถ€ํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด N+1 ํฌ๊ธฐ๋กœ ์„ ์–ธํ–ˆ๋‹ค.

- visited ๋ฐฐ์—ด์€ ์ •์ ์˜ ๋ฐฉ๋ฌธ์„ ๊ธฐ๋กํ•˜๋Š” ์—ญํ• ์ด๋‹ค.

- graph ๋ฐฐ์—ด์€ ์ •์  ๋ฒˆํ˜ธ๋งˆ๋‹ค ๋ณ„๋„์˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

 

  • ๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ
// ๊ทธ๋ž˜ํ”„์— ๊ฐ„์„  ์ •๋ณด ์ €์žฅ
for (int i = 0; i < M; i++) {
    str = br.readLine().split(" ");
    int u = Integer.parseInt(str[0]);
    int v = Integer.parseInt(str[1]);

    // ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
    graph.get(u).add(v);
    graph.get(v).add(u);
}

 

- ๊ฐ„์„ ์˜ ์ˆ˜ M๋งŒํผ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉฐ ๊ฐ„์„ ์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

- ์˜ˆ๋ฅผ ๋“ค์–ด ์ž…๋ ฅ์ด 1 4 ์ด๋ฉด ์ •์  1๊ณผ ์ •์  4๋ฅผ ์—ฐ๊ฒฐํ–ˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ์ด๋Š” ์ •์  4์™€ ์ •์  1์„ ์—ฐ๊ฒฐํ–ˆ๋‹ค๋Š” ๋œป๊ณผ๋„ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.

 

  • ์ •์  ๋ฒˆํ˜ธ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธ
// ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
for (int i = 1; i < N + 1; i++) {
    Collections.sort(graph.get(i));
}

 

- ์ž๋ฐ” Collections์˜ sort() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์„ ๊ฐ„๋‹จํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • ์ •์  ๋ฒˆํ˜ธ๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธ
// ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
for (int i = 1; i < N + 1; i++) {
    Collections.sort(graph.get(i), Collections.reverseOrder());
}

 

- reverseOrder() ๋ฉ”์„œ๋“œ๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์ด๋‹ค.

 

  • DFS ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ 
// DFS ํƒ์ƒ‰
private static void dfs(int node) {
    visited[node] = count; // ๋ฐฉ๋ฌธ ์ˆœ์„œ ๊ธฐ๋ก

    for (int i = 0; i < graph.get(node).size(); i++) {
        int nextNode = graph.get(node).get(i);
        if (visited[nextNode] == 0) { // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
            count++;
            dfs(nextNode);
        }
    }
}

 

- ์œ„์—์„œ ๋ชจ๋“  ์ค€๋น„๊ฐ€ ๋๋‚ฌ๋‹ค๋ฉด DFS ํƒ์ƒ‰์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณตํ•œ๋‹ค.

- ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์€ ๋ฐฉ๋ฌธ์ˆœ์„œ์ด๋‹ค.

 

 

์ „์ฒด์ฝ”๋“œ
import java.io.*;
import java.util.*;

public class Main{
    
    static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
    static int[] visited;
    static int count;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String[] str = br.readLine().split(" ");
        
        int N = Integer.parseInt(str[0]);
        int M = Integer.parseInt(str[1]);
        int R = Integer.parseInt(str[2]);
        
        //๋ฐฉ๋ฌธ์ฒดํฌํ•  ๋ฐฐ์—ด
        visited = new int[N+1];
        
        //graph ์ดˆ๊ธฐํ™”
        for(int i=0; i<N+1; i++){
            graph.add(new ArrayList<>());
        }
        
        //graph์— ๊ฐ’ ์ €์žฅ
        for(int i=0; i<M; i++){
            str = br.readLine().split(" ");
            int u = Integer.parseInt(str[0]);
            int v = Integer.parseInt(str[1]);
            
            //๋ฌด๋ฐฉํ–ฅ๊ทธ๋ž˜ํ”„
            graph.get(u).add(v);
            graph.get(v).add(u);
        }
        
        //์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ (24479๋ฒˆ ๋ฌธ์ œ)
        for(int i=1; i<N+1; i++){
            Collections.sort(graph.get(i));
        }
        
        //๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ (24480๋ฒˆ ๋ฌธ์ œ)
        for(int i=1; i<N+1; i++){
            Collections.sort(graph.get(i), Collections.reverseOrder());
        }
        
        //๋ฐฉ๋ฌธ ์นด์šดํŠธ
        count = 1;
        //์‹œ์ž‘์ •์ ๋ถ€ํ„ฐ ํƒ์ƒ‰
        dfs(R);
        
        //์ถœ๋ ฅ
        for(int i=1; i<=N; i++){
            System.out.println(visited[i]);
        }
    }
    
    //DFS ํƒ์ƒ‰
    private static void dfs(int node){
        visited[node] = count;
        
        for(int i=0; i<graph.get(node).size(); i++){
            int nextNode = graph.get(node).get(i);
            if(visited[nextNode] == 0){ //๋ฐฉ๋ฌธํ•œ์  ์—†์œผ๋ฉด
                count++;
                dfs(nextNode);
            }
        }
    }
}