πŸ“– [λ°±μ€€μ•Œκ³ λ¦¬μ¦˜ 풀이] Q.2606 λ°”μ΄λŸ¬μŠ€ 문제 풀이 - java

πŸ“– 문제

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

μ‹ μ’… λ°”μ΄λŸ¬μŠ€μΈ μ›œ λ°”μ΄λŸ¬μŠ€λŠ” λ„€νŠΈμ›Œν¬λ₯Ό 톡해 μ „νŒŒλœλ‹€. ν•œ 컴퓨터가 μ›œ λ°”μ΄λŸ¬μŠ€μ— 걸리면

κ·Έ 컴퓨터와 λ„€νŠΈμ›Œν¬ μƒμ—μ„œ μ—°κ²°λ˜μ–΄ μžˆλŠ” λͺ¨λ“  μ»΄ν“¨ν„°λŠ” μ›œ λ°”μ΄λŸ¬μŠ€μ— 걸리게 λœλ‹€.

예λ₯Ό λ“€μ–΄ 7λŒ€μ˜ 컴퓨터가 <κ·Έλ¦Ό 1>κ³Ό 같이 λ„€νŠΈμ›Œν¬ μƒμ—μ„œ μ—°κ²°λ˜μ–΄ μžˆλ‹€κ³  ν•˜μž.

1번 컴퓨터가 μ›œ λ°”μ΄λŸ¬μŠ€μ— 걸리면 μ›œ λ°”μ΄λŸ¬μŠ€λŠ” 2번과 5번 컴퓨터λ₯Ό 거쳐 3번과 6번 μ»΄ν“¨ν„°κΉŒμ§€ μ „νŒŒλ˜μ–΄

2, 3, 5, 6 λ„€ λŒ€μ˜ μ»΄ν“¨ν„°λŠ” μ›œ λ°”μ΄λŸ¬μŠ€μ— 걸리게 λœλ‹€. ν•˜μ§€λ§Œ 4번과 7번 μ»΄ν“¨ν„°λŠ” 1번 컴퓨터와 λ„€νŠΈμ›Œν¬μƒμ—μ„œ

μ—°κ²°λ˜μ–΄ μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 영ν–₯을 받지 μ•ŠλŠ”λ‹€.

example

μ–΄λŠ λ‚  1번 컴퓨터가 μ›œ λ°”μ΄λŸ¬μŠ€μ— κ±Έλ Έλ‹€. μ»΄ν“¨ν„°μ˜ μˆ˜μ™€ λ„€νŠΈμ›Œν¬ μƒμ—μ„œ μ„œλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” 정보가 μ£Όμ–΄μ§ˆ λ•Œ,

1번 컴퓨터λ₯Ό 톡해 μ›œ λ°”μ΄λŸ¬μŠ€μ— 걸리게 λ˜λŠ” μ»΄ν“¨ν„°μ˜ 수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

πŸ” 접근법

Q.2606 λ°”μ΄λŸ¬μŠ€ 문제 ν’€μ΄μž…λ‹ˆλ‹€.

ν•œ 컴퓨터가 λ°”μ΄λŸ¬μŠ€μ— 걸렸을 λ•Œ

μ—°κ²°λœ λ„€νŠΈμ›Œν¬(κ·Έλž˜ν”„)λ₯Ό 톡해 λ°”μ΄λŸ¬μŠ€κ°€ μ—°κ²°λœ 컴퓨터에 μ „νŒŒλ©λ‹ˆλ‹€.

1번 컴퓨터가 λ°”μ΄λŸ¬μŠ€μ— 걸렸을 λ•Œ

총 λͺ‡ λŒ€μ˜ 컴퓨터에 μ „νŒŒλ˜λŠ”μ§€λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

κ·Έλž˜ν”„ 탐색 문제둜 인접 리슀트둜 λ„€νŠΈμ›Œν¬(κ·Έλž˜ν”„)λ₯Ό ν‘œν˜„ν•˜κ³ 

bfs λ‚˜ dfs 탐색을 톡해 λͺ‡ λŒ€μ˜ 컴퓨터에 μ „νŒŒλ˜λŠ”μ§€λ₯Ό ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ¬Έμ œμ— 주어진 κ²ƒμ²˜λŸΌ 좜발 지점은 1번 μ»΄ν“¨ν„°λ‘œ κ³ μ •λ˜μ–΄ μžˆμœΌλ―€λ‘œ

bfs λ‚˜ dfs 탐색을 1λ²ˆλΆ€ν„° μ‹œμž‘ν•˜λ©΄ λ©λ‹ˆλ‹€. μƒˆλ‘œμš΄ 컴퓨터에 μ „νŒŒλ  λ•Œλ§ˆλ‹€

μƒˆλ‘œ λ°”μ΄λŸ¬μŠ€μ— κ±Έλ¦° λŒ€μˆ˜λ₯Ό 늘렀주면 닡을 ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€. (count++)

bfs 탐색 dfs 탐색을 λͺ¨λ‘ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

πŸ’» μ½”λ“œ

package problem.bfsdfs;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class Main_2606 {
    static int N, M;
    static boolean[] visit;
    static List<List<Integer>> adList;
    static int count = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        M = Integer.parseInt(br.readLine());
        adList = new ArrayList<>();
        for (int i = 0; i < N + 1; i++) {
            adList.add(new <Integer>ArrayList());
        }
        visit = new boolean[N + 1];
        for (int i = 0; i < M; i++) {
            String temp[] = br.readLine().split(" ");
            int u = Integer.parseInt(temp[0]);
            int v = Integer.parseInt(temp[1]);
            adList.get(u).add(v);
            adList.get(v).add(u);
        }

        dfs(1);

        System.out.println(count);
        br.close();
    }

    public static void bfs(int num) {
        Queue<Integer> queue = new LinkedList<>();
        visit[num] = true;
        queue.add(num);

        while (!queue.isEmpty()) {
            int currentNum = queue.poll();
            for (int i : adList.get(currentNum)) {
                if (visit[i] == false) {
                    visit[i] = true;
                    queue.add(i);
                    count++;
                }
            }
        }
    }

    public static void dfs(int num) {
        visit[num] = true;

        for (int i : adList.get(num)) {
            if (visit[i] == false) {
                dfs(i);
                count++;
            }
        }

    }
}

Written on February 6, 2021