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

 

4963번: 섬의 개수

문제 정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오. 한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다.  두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러쌓여 있으며, 지도 밖으로 나갈 수 없다. 입력 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는

www.acmicpc.net

DFS나 BFS를 사용해서 연결 요소를 구하는 문제이다.

  1. 땅이고 아직 방문하지 않은 곳을 DFS를 통해서 모두 방문해줬다.
  2. 새로 DFS를 실핼해줄때마다 count값을 증가시킨다.

 

import java.util.*;

public class Main {
	static int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
	static int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true) {
			int w = sc.nextInt();
			int h = sc.nextInt();
            
			if(w ==0 && h ==0) //종료 조건
				break;
			
            int count = 0;
			int square[][] = new int[h][w];
			boolean check[][] = new boolean[h][w];
            
			for(int i=0; i<h; i++) {
				for(int j=0; j<w; j++) {
					square[i][j] = sc.nextInt();
				}
			}
            
			for(int i=0; i<h; i++) {
				for(int j=0; j<w; j++) {
					if(square[i][j] == 1 && check[i][j] == false){ //땅인데 아직 방문하지 않았다.
						dfs(i, j, square, check, h, w);	
						count++;
					}
				}
			}
			System.out.println(count);
		}
	}
	static void dfs(int i, int j, int[][] square, boolean[][] check, int h, int w) {
		check[i][j] = true; //방문 체크
		for(int k=0; k<8; k++) {
			int x = i+dx[k];
			int y = j+dy[k];
			if(x >= 0 && y >= 0 && x &lt h && y &lt w)
				if(square[x][y] == 1 && check[x][y] == false) //땅인데 방문하지 않은 곳 방문
					dfs(x, y, square, check, h, w);
		}
	}

}
            
 

'BOJ' 카테고리의 다른 글

[BOJ] 2583. 영역 구하기  (0) 2019.05.01
[BOJ] 2606. 바이러스  (0) 2019.05.01
[BOJ] 7569. 토마토 (3차원)  (0) 2019.04.30
[BOJ] 7576. 토마토  (0) 2019.04.30
[BOJ] 11724. 연결 요소의 개수  (0) 2019.04.29

+ Recent posts