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

[๋ฐฑ์ค€] 2667๋ฒˆ: ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ(๊ทธ๋ž˜ํ”„, DFS)

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

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

 

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

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

www.acmicpc.net

์ฝ”๋“œ

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	static int[][] map = new int[25][25];	// ์ง‘์˜ ์กด์žฌ ์ž…๋ ฅํ•  2์ฐจ์› ๋ฐฐ์—ด
	static boolean[][] visit = new boolean[25][25];	// ํƒ์ƒ‰ํ•  ์ง‘์˜ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ์ฒดํฌ
	private static int[] dx = {0, -1, 0, 1};	// dx, dy = ์ƒํ•˜์ขŒ์šฐ
	private static int[] dy = {-1, 0, 1, 0};	
	static int count = 1;	// ๋ฐฉ๋ฌธํ•œ ๋‹จ์ง€ ๋ฒˆํ˜ธ(์—ฐ๊ฒฐ๋œ ๋‹จ์ง€๊ฐ€ ์•„๋‹๊ฒฝ์šฐ 1์”ฉ ์ฆ๊ฐ€)
	static int N;			// ์ง€๋„์˜ ํฌ๊ธฐ
	
	// <- , ↑ , -> , ↓ ... ๋™์„œ๋‚จ๋ถ 4๋ฐฉํ–ฅ ์ฒดํฌํ•ด๊ฐ€๋ฉฐ dfs ๋Œ๋ฆฌ๊ธฐ
	public static void dfs(int x, int y) {
		map[x][y] = count;	// ๋ฐฉ๋ฌธํ•œ ์ง‘ => count๋กœ ํ‘œ์‹œ(1, 2, 3, ... ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€)
		visit[x][y] = true;	// ๋ฐฉ๋ฌธํ•œ ์ง‘ => true ์ฒดํฌ
		for(int i=0; i<4; i++) {	// ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์ฒดํฌ
			int nx = x + dx[i];
			int ny = y + dy[i];
			
			// nx, ny = ์ขŒํ‘œ์˜ ๋ฒ”์œ„, N*N ํฌ๊ธฐ์ด๋ฏ€๋กœ x, y์ขŒํ‘œ๊ฐ€ 0๋ณด๋‹จ ์ปค์•ผํ•˜๊ณ  N๋ณด๋‹จ ์ž‘์•„์•ผํ•จ.
			if(nx>=0 && ny>=0 && nx<N && ny<N) {	
				if(map[nx][ny] == 1 && visit[nx][ny] == false) {
					dfs(nx, ny);	// 1์ด๋ฉด์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€๊ณณ => dfs ๋Œ๋ฆฌ๊ธฐ
				}
			}
		}
	}
	
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		N = scan.nextInt();	// ์ง€๋„์˜ ํฌ๊ธฐ
		for(int i=0; i<N; i++) {	// 2์ฐจ์› ํ–‰๋ ฌ ์ž…๋ ฅ๋ฐ›๊ธฐ
			String str = scan.next();
			for(int j=0; j<N; j++) {
				map[i][j] = str.charAt(j) - '0';
			}
		}
		
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				if(map[i][j] == 1 && visit[i][j] == false) {
					dfs(i, j);	// 1์ด๋ฉด์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€๊ณณ => dfs ๋Œ๋ฆฌ๊ณ  ๋‹จ์ง€์ˆ˜ ์นด์šดํŠธ
					count ++;	// dfs ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ๋๋‚ ๋•Œ => ํƒ์ƒ‰(์ธ์ ‘)์ด ๋๋‚ฌ์œผ๋ฏ€๋กœ, ๋‹ค์Œ ์ธ์ ‘๋œ ์ง‘์˜ ๋‹จ์ง€ ๋ฒˆํ˜ธ๋ฅผ +1 ํ•ด์ค˜์•ผ ํ•จ.
				}
			}
		}
		
		System.out.println(count-1);	// ๋‹จ์ง€์ˆ˜ ์ถœ๋ ฅ
		int[] arr = new int[count];		// ๋‹จ์ง€์ˆ˜ ๋งŒํผ ์ง‘์˜ ์ˆ˜ ์„ค์ •
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				if(map[i][j] != 0) {	// ์ง‘์ด ์žˆ๋Š” ๊ณณ์ธ ๊ฒฝ์šฐ
					arr[map[i][j]] ++;	// ์ง‘์ด ์žˆ๋Š” map[i][j]์˜ ๊ฒฝ์šฐ count๋กœ ์ €์žฅ๋˜์—ˆ์œผ๋ฏ€๋กœ, ๋‹จ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
				}
			}
		}
		
		Arrays.sort(arr);
		for(int i=1; i<count; i++) 
			System.out.println(arr[i]);	// ๊ฐ ๋‹จ์ง€๋ฒˆํ˜ธ ๋ณ„๋กœ ๋‹จ์ง€์ˆ˜ ์ถœ๋ ฅ
		scan.close();
	}

}

ํ’€์ด

๊ทธ๋ž˜ํ”„ - DFS, BFS์—์„œ ์‘์šฉ๋œ ๋ฌธ์ œ์ด๋‹ค.

๋‹ค๋ฅธ ํ’€์ด๋“ค์„ ๋ณด๋‹ˆ dfs, bfs ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ํ’€์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ถ„๋ฅ˜๊ฐ€ dfs๋กœ ๋ผ์žˆ์–ด์„œ dfs๋กœ ํ’€์—ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด 1์€ ์ง‘์ด ์žˆ๋Š”๊ณณ, 0์€ ์ง‘์ด ์—†๋Š” ๊ณณ์ด๋‹ค.

์—ฐ๊ฒฐ๋œ ์ง‘๋“ค์˜ ๋ชจ์ž„์ธ ๋‹จ์ง€๋ฅผ ์ •์˜ํ•˜๊ณ , ๋‹จ์ง€์— ๋ฒˆํ˜ธ๋ฅผ ๋ถ™์ด๋Š”๋ฐ 

์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ์–ด๋– ํ•œ ์ง‘์˜ ์ƒํ•˜์ขŒ์šฐ์ค‘ ํ•˜๋‚˜์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. (๋Œ€๊ฐ์„  X)

https://ldgeao99.tistory.com/400

์ฆ‰ ์ง€๋„์—์„œ ์ง‘์ด ์žˆ๋Š” ๊ณณ(1)์ธ ๊ธฐ์ ์„ ๊ธฐ์ค€์œผ๋กœ dfs๋ฅผ ๋Œ๋ฆฌ๋Š”๋ฐ ์ด ๋•Œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ dfs๋ฅผ ๋Œ๋ฆฐ๋‹ค.

dfs๋ฅผ ๋Œ๋ฆฐ ํ›„ 1์ธ๊ฒฝ์šฐ ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ๊ณ„์† ๋Œ๋ฆฌ๊ณ , ๋ฐฉ๋ฌธํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค.

๊ทธ ํ›„ dfs์˜ ํ˜ธ์ถœ์ด ๋๋‚ฌ์„ ๊ฒฝ์šฐ,, ๋‹ค์Œ ์—ฐ๊ฒฐ๋œ ์ง‘์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋‹จ์ง€ ๋ฒˆํ˜ธ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ์ค€๋‹ค.

๊ธฐํƒ€ ์ž์„ธํ•œ ์„ค๋ช…์€ ์ฃผ์„์„ ํ†ตํ•ด ์„ค๋ช…ํ–ˆ์Œ ....

 

์•„์ง ๊ทธ๋ž˜ํ”„๋‚˜ ์žฌ๊ท€ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์™„๋ฒฝํ•˜์ง„ ์•Š์ง€๋งŒ, ๊ธฐ์กด dfs, bfs ์›๋ฆฌ์—์„œ ์—„์ฒญ ํฌ๊ฒŒ ์‘์šฉ์ด ๋˜์ง„ ์•Š์•˜๋‹ค. 

๊ฐ ์ฝ”๋“œ๊ฐ€ ์ดํ•ด๋Š” ๋˜์ง€๋งŒ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ๋Š” ์ข€ ๋ฒ„๊ฑฐ์šธ ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค์–‘ํ•œ ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ๋“ค ํ’€๋ฉด์„œ ์ดํ•ดํ•˜๊ณ  ์‘์šฉํ•ด๋ด์•ผ๊ฒ ๋‹ค .

 

์ฐธ๊ณ ํ•œ ์‚ฌ์ดํŠธ

https://ldgeao99.tistory.com/400

 

์ฑ•ํ„ฐ6-5. ๊ทธ๋ž˜ํ”„ | ๋ฌธ์ œํ’€์ด(2) - ํ”Œ๋Ÿฌ๋“œํ•„ ์•Œ๊ณ ๋ฆฌ์ฆ˜(DFS, BFS ํƒ์ƒ‰์‘์šฉ)

ํ”Œ๋Ÿฌ๋“œํ•„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์–ด๋–ค ๋ฐฐ์—ด์„ ์ฑ„์šฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ฉฐ, ์–ด๋–ค ์œ„์น˜์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์œ„์น˜๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. - dx, dy ๊ฐ€ ์‚ฌ์šฉ๋จ. ์œ ํ˜•1. ๋™์‹œ์— ์ง„ํ–‰๋˜๋Š” ํƒ์ƒ‰์ด 1๊ฐœ๋ฟ์ธ ๊ฒƒ # ๋‹จ์ง€์— ๋ฒˆํ˜ธ๋ฅผ ๋ถ™์ด๋Š” ๋ฌธ์ œ - http..

ldgeao99.tistory.com

 - dfs, bfs ์‘์šฉ ๋ฌธ์ œ๋“ค ํ•ด์„ค

 

 

https://pangsblog.tistory.com/28

 

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

๋ฌธ์ œ ๋งํฌ : https://www.acmicpc.net/problem/2667 ์ด ๋ฌธ์ œ๋Š” ์ฒ˜์Œ์—๋Š” ์ ‘๊ทผ๋ฒ•์ด ๊ฐ์ด ์•ˆ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ž…๋ ฅ๋ฐ›์€ ์ด์ฐจ์› ๋ฐฐ์—ด์„ ํ•˜๋‚˜์”ฉ ์ ‘๊ทผํ•ด ๋‚˜๊ฐ€๋ฉด์„œ 0 ์ด๋ฉด ๋ฌด์‹œํ•˜๊ณ  1์ด๊ณ  BFS๋กœ ์ ‘๊ทผ ์ด๋ ฅ์ด ์—†์œผ๋ฉด ๊ทธ ์ขŒํ‘œ๋ฅผ..

pangsblog.tistory.com

 - ๋ฌธ์ œ ํ’€์ด๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์ž˜ ๋˜์–ด์žˆ์Œ.

 

 

https://justgo-developer.tistory.com/49

 

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

import java.util.*; public class Main { static int N; static int[][] map = new int[25][25]; static boolean[][] visit = new boolean[25][25]; static int[] dx = {0,1,0,-1}; static int[] dy = {1,0,-1,0}..

justgo-developer.tistory.com

 - ์ฐธ๊ณ ํ•œ ์ฝ”๋“œ

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€