01-08 08:57
Recent Posts
Recent Comments
๊ด€๋ฆฌ ๋ฉ”๋‰ด

miinsun

[BAEKJOON] ๋ฐฑ์ค€ DFS 1012 :: ์œ ๊ธฐ๋† ๋ฐฐ์ถ” ๋ณธ๋ฌธ

Algorithm/Baekjoon

[BAEKJOON] ๋ฐฑ์ค€ DFS 1012 :: ์œ ๊ธฐ๋† ๋ฐฐ์ถ”

miinsun 2022. 4. 23. 23:50

๐Ÿ’ฌ  ๋ฌธ์ œ ์„ค๋ช…

์ฐจ์„ธ๋Œ€ ์˜๋†์ธ ํ•œ๋‚˜๋Š” ๊ฐ•์›๋„ ๊ณ ๋žญ์ง€์—์„œ ์œ ๊ธฐ๋† ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋†์•ฝ์„ ์“ฐ์ง€ ์•Š๊ณ  ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๋ ค๋ฉด ๋ฐฐ์ถ”๋ฅผ ํ•ด์ถฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ๋‚˜๋Š” ํ•ด์ถฉ ๋ฐฉ์ง€์— ํšจ๊ณผ์ ์ธ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๋ฅผ ๊ตฌ์ž…ํ•˜๊ธฐ๋กœ ๊ฒฐ์‹ฌํ•œ๋‹ค.

์ด ์ง€๋ ์ด๋Š” ๋ฐฐ์ถ”๊ทผ์ฒ˜์— ์„œ์‹ํ•˜๋ฉฐ ํ•ด์ถฉ์„ ์žก์•„ ๋จน์Œ์œผ๋กœ์จ ๋ฐฐ์ถ”๋ฅผ ๋ณดํ˜ธํ•œ๋‹ค. ํŠนํžˆ, ์–ด๋–ค ๋ฐฐ์ถ”์— ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•œ ๋งˆ๋ฆฌ๋ผ๋„ ์‚ด๊ณ  ์žˆ์œผ๋ฉด ์ด ์ง€๋ ์ด๋Š” ์ธ์ ‘ํ•œ ๋‹ค๋ฅธ ๋ฐฐ์ถ”๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์–ด, ๊ทธ ๋ฐฐ์ถ”๋“ค ์—ญ์‹œ ํ•ด์ถฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ํ•œ ๋ฐฐ์ถ”์˜ ์ƒํ•˜์ขŒ์šฐ ๋„ค ๋ฐฉํ–ฅ์— ๋‹ค๋ฅธ ๋ฐฐ์ถ”๊ฐ€ ์œ„์น˜ํ•œ ๊ฒฝ์šฐ์— ์„œ๋กœ ์ธ์ ‘ํ•ด์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

ํ•œ๋‚˜๊ฐ€ ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๋Š” ๋•…์€ ๊ณ ๋ฅด์ง€ ๋ชปํ•ด์„œ ๋ฐฐ์ถ”๋ฅผ ๊ตฐ๋ฐ๊ตฐ๋ฐ ์‹ฌ์–ด ๋†“์•˜๋‹ค. ๋ฐฐ์ถ”๋“ค์ด ๋ชจ์—ฌ์žˆ๋Š” ๊ณณ์—๋Š” ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•œ ๋งˆ๋ฆฌ๋งŒ ์žˆ์œผ๋ฉด ๋˜๋ฏ€๋กœ ์„œ๋กœ ์ธ์ ‘ํ•ด์žˆ๋Š” ๋ฐฐ์ถ”๋“ค์ด ๋ช‡ ๊ตฐ๋ฐ์— ํผ์ ธ์žˆ๋Š”์ง€ ์กฐ์‚ฌํ•˜๋ฉด ์ด ๋ช‡ ๋งˆ๋ฆฌ์˜ ์ง€๋ ์ด๊ฐ€ ํ•„์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์ถ”๋ฐญ์ด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉด ์ตœ์†Œ 5๋งˆ๋ฆฌ์˜ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
0์€ ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ์ง€ ์•Š์€ ๋•…์ด๊ณ , 1์€ ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ๋Š” ๋•…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๐Ÿ”จ  ์ž…์ถœ๋ ฅ ์˜ˆ

์ž…๋ ฅ 

  • ์ž…๋ ฅ์˜ ์ฒซ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  • ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ์ฒซ์งธ ์ค„์—๋Š” ๋ฐฐ์ถ”๋ฅผ ์‹ฌ์€ ๋ฐฐ์ถ”๋ฐญ์˜ ๊ฐ€๋กœ๊ธธ์ด M(1 ≤ M ≤ 50)๊ณผ ์„ธ๋กœ๊ธธ์ด N(1 ≤ N ≤ 50), ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ๋Š” ์œ„์น˜์˜ ๊ฐœ์ˆ˜ K(1 ≤ K ≤ 2500)์ด ์ฃผ์–ด์ง„๋‹ค.
  • ๊ทธ ๋‹ค์Œ K์ค„์—๋Š” ๋ฐฐ์ถ”์˜ ์œ„์น˜ X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฐฐ์ถ”์˜ ์œ„์น˜๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

 

์ถœ๋ ฅ

  • ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ์˜ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด ๋งˆ๋ฆฌ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ 1)

2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5

 

์˜ˆ์ œ ์ถœ๋ ฅ 1)

5
1

 

์˜ˆ์ œ ์ž…๋ ฅ 2)

1
5 3 6
0 2
1 2
2 2
3 2
4 2
4 0

 

์˜ˆ์ œ ์ถœ๋ ฅ 2)

2

 

โ€‹

๐Ÿ’ป  Main.java

  • dfs์™€ bfs๋ฅผ ํ†ตํ•ด ํ’€์ˆ˜์žˆ๋‹ค. ์•„๋ž˜ ํ’€์ด๋Š” dfs๋ฅผ ์ด์šฉํ•ด ํ’€์ดํ–ˆ๋‹ค.
  • ์ด์ฐจ์› ๋ฐฐ์—ด field์— ํƒ์ƒ‰์ „์ธ ๋ฐฐ์ถ”๋ฅผ -1๋กœ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
  • ๋ฐฐ์ถ” ๋ฐญ์„ ํƒ์ƒ‰ํ•˜๋ฉฐ ์•„์ง ํƒ์ƒ‰์ ์ธ ๋ฐฐ์ถ”(-1)๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ๊ทธ ๋ฐฐ์ถ”๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.
  • ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์€ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ field๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋„๋ก ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค
    • 0 <= X
    • 0 <= Y
    • X < M (๋ฐฐ์ถ” ๋ฐญ์˜ ๊ฐ€๋กœ ๊ธธ์ด)
    • Y < N (๋ฐฐ์ถ” ๋ฐญ์˜ ์„ธ๋กœ ๊ธธ์ด)
/* ๋ฐฑ์ค€ DFS์™€ BFS - 1012 :: ์œ ๊ธฐ๋† ๋ฐฐ์ถ” */

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

public class Main {
	static int[][] field;
	static int M, N, K;
	
	// ์ƒํ•˜์ขŒ์šฐ ์ขŒํ‘œ
	static int[] dx = {0, 1, 0, -1};
	static int[] dy = {-1, 0, 1, 0};
	
	public static void dfs(int y, int x, int n) {
		// ํƒ์ƒ‰ํ•œ ๋ฐฐ์ถ”๋Š” ์ง€๋ ์ด์˜ ์ˆ˜๋กœ ํ‘œ๊ธฐ
		field[y][x] = n;
		
		// ํƒ‘์ƒ‰ํ•œ ๋ฐฐ์ถ”๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ์ƒํ•˜์ขŒ์šฐ์— ํƒ์ƒ‰์ „์ธ ๋ฐฐ์ถ”๋ฅผ ์ฐพ์•„ ๊นŠ์ด ํƒ์ƒ‰
		for(int i = 0; i < 4; i++) {
			int nY = y + dy[i];
			int nX = x + dx[i];
			
			if(0 <= nX && 0 <= nY && nX < M && nY < N)
				if(field[nY][nX] == -1)
					dfs(nY, nX, n);
		}
	}
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		
		for(int i = 0; i < T; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());

			M = Integer.parseInt(st.nextToken());	// ๋ฐญ์˜ ๊ฐ€๋กœ๊ธธ์ด
			N = Integer.parseInt(st.nextToken());	// ๋ฐญ์˜ ์„ธ๋กœ๊ธธ์ด
			K = Integer.parseInt(st.nextToken());	// ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ง„ ์œ„์น˜
			
			field = new int[N][M];
			
			// ๋ฐฐ์ถ”๋ฐญ ์ •๋ณด ์ž…๋ ฅ
			for(int j = 0; j < K; j++) {
				st = new StringTokenizer(br.readLine());
				int x = Integer.parseInt(st.nextToken());
				int y = Integer.parseInt(st.nextToken());
				
				// ์•„์ง ๊ฒ€์‚ฌ ์ „์ธ ๋ฐฐ์ถ”๋ฐญ์„ -1๋กœ ํ‘œํ˜„
				field[y][x] = -1;
			}			
			
			int n = 0;	// ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด ์ˆ˜
			
			// ๋ฐญ์„ ํƒ‘์ƒ‰ํ•˜๋ฉฐ ์•„์ง ๊ฒ€์‚ฌ ์ „์ธ ๋ฐฐ์ถ”๋ฐญ์—์„œ ๊นŠ์ดํƒ‘์ƒ‰์„ ํ•ด์คŒ
			for(int j = 0; j < N; j++) {
				for(int k = 0; k < M; k++) {
					if(field[j][k] == -1) {
						dfs(j, k, n++);	// ํƒ์ƒ‰์„ ํ• ๋•Œ๋งˆ๋‹ค ์ง€๋ ์ด์˜ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚จ
					}
				}
			}
			
			System.out.println(n);
		}
		
		
		br.close();
	}
}
Comments