오늘은 지난 포스팅에 이어서 BFS에 대해서 정리해보려한다.
: 너비 우선 탐색으로 루트 노드에서 시작해서 가장 인접한 노드를 먼저 탐색하는 방식이다.
주로, 두 노드 사이의 최단 경로 또는 임의의 경로를 찾고 싶을때 사용한다.
package etc.ThisIsCoTe;
import java.util.Scanner;
/*
N x M 크기의 얼음 틀이 있다. 구멍이 뚫려 있는 부분은 0, 칸막이가 존재하는 부분은 1로 표시된다. 구멍이 뚫려 있는 부분끼리 상,하,좌,우로 붙어 있는 경우 서로 연결되어 있는 것으로 간주한다. 이때 얼음 틀의 모양이 주어졌을 때 생성되는 총 아이스크림의 개수를 구하는 프로그램을 작성하시오.
🎁입력예시
4 5
00110
00011
11111
00000
🎊출력예시
3
전략
이 문제는 DFS 혹은 BFS로 해결 할 수 있다. (모든 정점을 방문하기만 하면 되므로 둘 다 사용 가능) 얼음을 얼릴 수 있는 공간이 상, 하, 좌, 우로 연결되어있다고 표현 할 수 있으므로 그래프 형태로 모델링 가능하다. 방문처리 영역만 카운트하면 된다.
ex.
001
010
101
*/
public class Ice {
public static int n , m;
// n 과 m을 최대 크기로 배열 생성
public static int[][] graph = new int[1000][1000];
public static boolean dfs(int x, int y){
if(x <= -1 || x >= n || y <= -1 || y >= m){
return false;
}
// 만약 노드에 아직 방문하지 않았더라면?
if(graph[x][y] == 0){
graph[x][y] = 1;
dfs(x-1, y);
dfs(x , y-1);
dfs(x+1 , y);
dfs(x,y+1);
return true;
}
return false;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int result = 0;
int n = sc.nextInt();
int m = sc.nextInt();
// 버퍼 삭제
sc.nextInt();
// 2차원 리스트 맵 정보
for (int i = 0; i < n; i++) {
String str = sc.nextLine();
for (int j = 0; j < m; j++) {
if(dfs(i,j)){
result += 1;
}
}
}
System.out.println(result);
}
}