[Problem Solving] BJ_2606. ๐Ÿฆ  ๋ฐ”์ด๋Ÿฌ์Šค

do_itยท2025๋…„ 8์›” 23์ผ

problem-solving

๋ชฉ๋ก ๋ณด๊ธฐ
6/14

๐Ÿง ๋ฌธ์ œ ๋ถ„์„

ํ•œ ์ปดํ“จํ„ฐ๊ฐ€ ๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฑธ๋ฆฌ๋ฉด ๊ทธ ์ปดํ“จํ„ฐ์™€ ๋„คํŠธ์›ŒํŠธ ์ƒ์—์„œ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ปดํ“จํ„ฐ๋Š” ๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฑธ๋ฆฌ๊ฒŒ ๋จ

  • [์ž…๋ ฅ]
    ์ฒซ๋ฒˆ์งธ ์ค„: N (์ปดํ“จํ„ฐ์˜ ์ˆ˜)
    ๋‘˜์งธ ์ค„: M (๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ปดํ“จํ„ฐ ์Œ์˜ ์ˆ˜)
    M๊ฐœ ์ค„: ํ•œ ์Œ์”ฉ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ปดํ“จํ„ฐ์˜ ๋ฒˆํ˜ธ ์Œ
  • [์ถœ๋ ฅ]
    1๋ฒˆ ์ปดํ“จํ„ฐ๊ฐ€ ๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฑธ๋ ธ์„ ๋•Œ, ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์ปดํ“จํ„ฐ์˜ ์ˆ˜

0. ์ž…์ถœ๋ ฅ

// ์ž…๋ ฅ
7
6
1 2
2 3
1 5
5 2
5 6
4 7

// ์ถœ๋ ฅ
4

1. ๋ฌธ์ œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

  • ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ
    ์ปดํ“จํ„ฐ: ๋…ธ๋“œ
    ์—ฐ๊ฒฐ ์ผ€์ด๋ธ”: ๊ฐ„์„ 
  • ์—ฐ๊ฒฐ๋…ธ๋“œ ํƒ์ƒ‰
    ์—ฐ๊ฒฐ ์ˆœ์„œ ์ƒ๊ด€์—†์Œ -> BFS /DFS
    1๋ฒˆ ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋‹ค์Œ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ๊ฐˆ ๋•Œ ์นด์šดํŒ…

๐Ÿ’ป ์ฝ”๋“œ ์ž‘์„ฑ

1. BFS


public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
		// [input]
		int N = Integer.parseInt(br.readLine());
		
		// ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
		List<List<Integer>> graph = new ArrayList<>();
		
		for(int i=0; i<=N+1; i++) {
			graph.add(new ArrayList<>());
		}
		
		// ๊ฐ„์„  ์ž…๋ ฅ
		int M = Integer.parseInt(br.readLine());
		
		for(int m=0; m<M; m++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int u = Integer.parseInt(st.nextToken());
			int v= Integer.parseInt(st.nextToken());
			
			graph.get(u).add(v);
			graph.get(v).add(u);
		}
		
		// bfs ํƒ์ƒ‰
		Deque<Integer> queue = new ArrayDeque<>();
		boolean[] visited=new boolean[N+1];
		
		queue.offer(1);
		visited[1]= true;
		int count = 0;
	
		while(!queue.isEmpty()) {
			int current=queue.poll();
			for(int el: graph.get(current)) {
				if(!visited[el]) {
					visited[el]=true;
					count ++;
					queue.add(el);
				}
			}
		}
		
		System.out.println(count);
	}// main


2. DFS

public class Main_DFS {
	static List<List<Integer>> graph;
	static boolean[] visited;
	static int count =0;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
		// [input]
		int N = Integer.parseInt(br.readLine());
		
		// ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
		graph = new ArrayList<>();
		
		for(int i=0; i<=N+1; i++) {
			graph.add(new ArrayList<>());
		}
		
		// visited ๋ฐฐ์—ด
		visited = new boolean[N+1];
		
		// ๊ฐ„์„  ์ž…๋ ฅ
		int M = Integer.parseInt(br.readLine());
		
		for(int m=0; m<M; m++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int u = Integer.parseInt(st.nextToken());
			int v= Integer.parseInt(st.nextToken());
			
			graph.get(u).add(v);
			graph.get(v).add(u);
		}
		
		// dfs ํƒ์ƒ‰
		
		dfs(1);
		
		System.out.println(count-1);
	}// main
	

	
	public static void dfs(int v) {
		
		visited[v]=true;
		++count;
		for(int next:graph.get(v)) {
			if(!visited[next]) {
				dfs(next);
			}
		}
		
	}
}

3.๋ณต์žก๋„ & ๊ฐœ์„  ๋ฐฉํ–ฅ

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(V + E)
    BFS, DFS ๋ชจ๋‘ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ์™€ ๊ฐ„์„ ์„ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

4. ๐Ÿคฏ ??? & !!!

  • DFS & BFS
    ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋” ์ ํ•ฉํ•œ๊ฐ€?
    ๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ชจ๋‘ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(V + E)๋กœ ๋™์ผ

  • DFS ํƒ์ƒ‰ ๋กœ์ง ์˜ค๋ฅ˜
    DFS ํ•จ์ˆ˜์—์„œ for ๋ฃจํ”„ ์—†์ด ์ฒซ ๋ฒˆ์งธ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋งŒ ํƒ์ƒ‰ํ•˜๋Š” ์‹ค์ˆ˜

  • ๊ฒฐ๊ณผ ์นด์šดํŠธ ์˜ค๋ฅ˜
    ์‹œ์ž‘์ ์ธ 1๋ฒˆ ์ปดํ“จํ„ฐ๋ฅผ ํฌํ•จํ•˜์—ฌ ์นด์šดํŒ…ํ•ด์„œ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ 1๋งŒํผ ํฌ๊ฒŒ ๋‚˜์˜ค๋Š” ์‹ค์ˆ˜

0๊ฐœ์˜ ๋Œ“๊ธ€