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

[๋ฐฑ์ค€] 10026๋ฒˆ: ์ ๋ก์ƒ‰์•ฝ(DFS)

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

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

 

10026๋ฒˆ: ์ ๋ก์ƒ‰์•ฝ

๋ฌธ์ œ ์ ๋ก์ƒ‰์•ฝ์€ ๋นจ๊ฐ„์ƒ‰๊ณผ ์ดˆ๋ก์ƒ‰์˜ ์ฐจ์ด๋ฅผ ๊ฑฐ์˜ ๋Š๋ผ์ง€ ๋ชปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ์ ๋ก์ƒ‰์•ฝ์ธ ์‚ฌ๋žŒ์ด ๋ณด๋Š” ๊ทธ๋ฆผ์€ ์•„๋‹Œ ์‚ฌ๋žŒ์ด ๋ณด๋Š” ๊ทธ๋ฆผ๊ณผ๋Š” ์ข€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ N×N์ธ ๊ทธ๋ฆฌ๋“œ์˜ ๊ฐ ์นธ์— R(๋นจ๊ฐ•), G(์ดˆ๋ก), B(ํŒŒ๋ž‘) ์ค‘ ํ•˜๋‚˜๋ฅผ ์ƒ‰์น ํ•œ ๊ทธ๋ฆผ์ด ์žˆ๋‹ค. ๊ทธ๋ฆผ์€ ๋ช‡ ๊ฐœ์˜ ๊ตฌ์—ญ์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋Š”๋ฐ, ๊ตฌ์—ญ์€ ๊ฐ™์€ ์ƒ‰์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋˜, ๊ฐ™์€ ์ƒ‰์ƒ์ด ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋‘ ๊ธ€์ž๋Š” ๊ฐ™์€ ๊ตฌ์—ญ์— ์†ํ•œ๋‹ค. (์ƒ‰์ƒ์˜ ์ฐจ์ด๋ฅผ ๊ฑฐ์˜ ๋Š๋ผ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๊ฐ™์€

www.acmicpc.net

์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	static char Grid[][];		// ๊ทธ๋ฆฌ๋“œ ๋งต
	static boolean visit[][];	// ๋ฐฉ๋ฌธ ์ฒดํฌ
	static int[] dx = {0, -1, 0, 1};	// ์ƒํ•˜์ขŒ์šฐ x 
	static int[] dy = {-1, 0, 1, 0};	// ์ƒํ•˜์ขŒ์šฐ y
	static int N;			// ๊ทธ๋ฆฌ๋“œ์˜ ํฌ๊ธฐ
	static int notRGB = 0;	// ์ ๋ก์ƒ‰์•ฝ ์•„๋‹Œ ์‚ฌ๋žŒ์ด ๋ดค์„๋•Œ
	static int RGB = 0;		// ์ ๋ก์ƒ‰์•ฝ์ธ ์‚ฌ๋žŒ์ด ๋ดค์„๋•Œ
	
	// <- , ↑ , -> , ↓ ... ๋™์„œ๋‚จ๋ถ 4๋ฐฉํ–ฅ ์ฒดํฌํ•ด๊ฐ€๋ฉฐ dfs ๋Œ๋ฆฌ๊ธฐ
	public static void dfs(int x, int y) {
		visit[x][y] = true;		// ํ˜„์žฌ ์œ„์น˜ ๋ฐฉ๋ฌธ์ฒดํฌ
		char color = Grid[x][y];	// ํ˜„์žฌ ์ƒ‰ ์ €์žฅ
		
		for(int i=0; i<4; i++) { // ์ƒํ•˜์ขŒ์šฐ ์ฒดํฌ
			int nx = x + dx[i];
			int ny = y + dy[i];
			
			if(nx>=0 && ny>=0 && nx<N && ny<N) {
				// ์ƒํ•˜์ขŒ์šฐ์ค‘ ๊ฐ™์€์ƒ‰์˜ ์•ฝ์ด๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€๊ณณ -> ๋๊นŒ์ง€ ํƒ์ƒ‰
				if(Grid[nx][ny] == color && !visit[nx][ny]) {
					dfs(nx, ny);
				}
			}
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		
		N = Integer.parseInt(bf.readLine());
		Grid = new char[N][N];
		visit = new boolean[N][N];
		for(int i=0; i<N; i++) {
			String str = bf.readLine();
			for(int j=0; j<N; j++) {
				Grid[i][j] = str.charAt(j);
			}
		}
		
		// ์ ๋ก์ƒ‰์•ฝ์ด ์•„๋‹Œ ์‚ฌ๋žŒ์ด ๋ดค์„๋•Œ ๊ตฌ์—ญ์˜ ๊ฐฏ์ˆ˜ ๊ตฌํ•˜๊ธฐ
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				if(!visit[i][j]) {
					dfs(i, j);
					notRGB ++;
				}
			}
		}
		
		// ์ ๋ก์ƒ‰์•ฝ์ธ ์‚ฌ๋žŒ์˜ ๊ฒฝ์šฐ -> ๋นจ๊ฐ„์ƒ‰๊ณผ ์ดˆ๋ก์ƒ‰์˜ ์ฐจ์ด๋ฅผ ๋Š๋ผ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๋™์ผํ•˜๊ฒŒ ๋ด„.
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				if(Grid[i][j] == 'G')	// ์ดˆ๋ก -> ๋นจ๊ฐ•์œผ๋กœ ๋ณ€๊ฒฝ
					Grid[i][j] = 'R';
			}
		}
		
		visit = new boolean[N][N];	// ๋ฐฉ๋ฌธํ‘œ์‹œ ์ดˆ๊ธฐํ™”
		
		// ์ ๋ก์ƒ‰์•ฝ์ธ ์‚ฌ๋žŒ์ด ๋ดค์„๋•Œ ๊ตฌ์—ญ์˜ ๊ฐฏ์ˆ˜ ๊ตฌํ•˜๊ธฐ
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				if(!visit[i][j]) {
					dfs(i, j);
					RGB ++;
				}
			}
		}
		
		System.out.println(notRGB + " " + RGB);
		bf.close();
	}

}

ํ’€์ด

์ ๋ก์ƒ‰์•ฝ -> ๋นจ๊ฐ„์ƒ‰๊ณผ ์ดˆ๋ก์ƒ‰์˜ ์ฐจ์ด๋ฅผ ๋Š๋ผ์ง€๋ชปํ•ด์„œ ๋นจ๊ฐ„์ƒ‰, ์ดˆ๋ก์ƒ‰์„ ๋™์ผํ•˜๊ฒŒ ๋ณด๊ณ  ์ฒดํฌํ•œ๋‹ค.

๊ทธ๋™์•ˆ ๋ฐฐ์—ด์— 0์ด๋‚˜ 1์˜ ๊ฐ’๋งŒ ๋“ค์–ด๊ฐ”๋Š”๋ฐ ์ด ๋ฌธ์ œ๋Š” RGB 3๊ฐœ์˜ ๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

์žฌ๊ท€ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ƒํ•˜์ขŒ์šฐ์˜ ๊ฐ’์ค‘ ํ˜„์žฌ์˜ ๋ฌธ์ž์™€ ๋™์ผํ•œ๊ฒฝ์šฐ ๋๊นŒ์ง€ ํƒ์ƒ‰์„ ํ•œ๋‹ค.

 

main() ํ•จ์ˆ˜์—์„œ ๋ฐฉ๋ฌธ๋˜์ง€ ์•Š์€๊ณณ์€ dfsํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ํ•ด๋‹น ์˜์—ญ์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž๋ฅผ ๋๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๋”์ด์ƒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์—†๋Š” ๋ถ€๋ถ„์—์„œ๋Š” ๊ตฌ์—ญ์˜ ๊ฐฏ์ˆ˜๋ฅผ +1์”ฉ ํ•ด์ค€๋‹ค.

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€