๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[๋ฐฑ์ค€] 1012๋ฒˆ: ์œ ๊ธฐ๋† ๋ฐฐ์ถ”(dfs, bfs)

by ์ฃผ๋ฐœ2 2020. 2. 7.
๋ฐ˜์‘ํ˜•

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

 

1012๋ฒˆ: ์œ ๊ธฐ๋† ๋ฐฐ์ถ”

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

www.acmicpc.net

์ฝ”๋“œ

import java.util.Scanner;

public class Main {
	static int map[][];
	static boolean visit[][];
	static int M, N, K;	// ๊ฐ€๋กœ, ์„ธ๋กœ, ๋ฐฐ์ถ” ๊ฐฏ์ˆ˜ 
	static int X, Y;	// ๋ฐฐ์ถ”์˜ ์œ„์น˜
	static int dx[] = {0, -1, 0, 1};	// ์ƒํ•˜์ขŒ์šฐ
	static int dy[] = {-1, 0, 1, 0};	// ์ƒํ•˜์ขŒ์šฐ
	static int count;	// ์ตœ์†Œ ํ•„์š”ํ•œ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด ๋งˆ๋ฆฌ ์ˆ˜
	
	public static void dfs(int y, int x) {
		visit[y][x] = true;
		for(int i=0; i<4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			
			// nx, ny = ์ขŒํ‘œ์˜ ๋ฒ”์œ„, M*N ํฌ๊ธฐ์ด๋ฏ€๋กœ x, y์ขŒํ‘œ๊ฐ€ 0๋ณด๋‹จ ์ปค์•ผํ•˜๊ณ  M, N๋ณด๋‹จ ์ž‘์•„์•ผํ•จ.
			if(nx>=0 && ny>=0 && nx<M && ny<N) {
				if(map[ny][nx] == 1 && !visit[ny][nx]) {
					dfs(ny, nx);
				}
			}
		}
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int T = scan.nextInt();
		for(int i=0; i<T; i++) {
			M = scan.nextInt();	// ๊ฐ€๋กœ
			N = scan.nextInt();	// ์„ธ๋กœ
			K = scan.nextInt();	// ๋ฐฐ์ถ” ๊ฐฏ์ˆ˜
			map = new int[N][M];
			visit = new boolean[N][M];
			count = 0;
			
			for(int j=0; j<K; j++) {
				int a = scan.nextInt();	// ๊ฐ€๋กœ
				int b = scan.nextInt();	// ์„ธ๋กœ
				map[b][a] = 1;
			}
			
			for(int j=0; j<N; j++) {
				for(int k=0; k<M; k++) {
					if(map[j][k] == 1 && visit[j][k] == false) {
						dfs(j, k);
						count ++;
					}
				}
			}
			System.out.println(count);
		}
		scan.close();
	}
}

ํ’€์ด

๋ฐฑ์ค€ 2667๋ฒˆ - ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ

์œ„ ๋ฌธ์ œ์™€ ๋…ผ๋ฆฌ๊ฐ€ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ์ด๋‹ค.

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€