connecting the dots

[BOJ/Java] 4963 : 섬의 개수 본문

algorithm/BOJ

[BOJ/Java] 4963 : 섬의 개수

林 : 2021. 2. 16. 17:27

문제

www.acmicpc.net/problem/4963

 

4963번: 섬의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도

www.acmicpc.net

 

풀이

쉬운 탐색 문제 / dfs 에서 true or false를 리턴하도록 하니까 따로 섬의 개수를 세지 않아도 된다

 

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	static int w, h;

	static int[][] map;
	static int[][] dir = { { -1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 }, { 1, 0 }, { 1, -1 }, { 0, -1 }, { -1, -1 } };

	public static boolean dfs(int x, int y) {
		if (x < 0 || y < 0 || x >= h || y >= w)
			return false;

		if (map[x][y] == 1) {

			map[x][y] = 0; // 해당 위치 방문 처리
			for (int d = 0; d < 8; d++) {
				int dx = x + dir[d][0];
				int dy = y + dir[d][1];
				dfs(dx, dy);
			}
			return true;
		}
		return false;
	}

	public static void main(String[] args) throws Exception {
		
		while (true) {
			st = new StringTokenizer(in.readLine(), " ");
			w = Integer.parseInt(st.nextToken());
			h = Integer.parseInt(st.nextToken());
			if(w == 0 && h == 0) return; //종료 조건
			// 섬에 대한 정보를 입력받기
			map = new int[h][w];
			int count = 0;
			for (int i = 0; i < h; i++) {
				st = new StringTokenizer(in.readLine(), " ");
				for (int j = 0; j < w; j++) {
					map[i][j] = Integer.parseInt(st.nextToken());
				}
			}

			for (int i = 0; i < h; i++) {
				for (int j = 0; j < w; j++) {
					if (dfs(i, j))
						count++; // dfs가 수행되는 곳에서 섬의 개수 세어주기
				}
			}
			System.out.println(count);

		}

	}

}

 

느낀점

탐색문제가 익숙해지고 있다 !

'algorithm > BOJ' 카테고리의 다른 글

[BOJ/Java] 16236 : 아기 상어  (0) 2021.02.17
[BOJ/Java] 3055 : 탈출  (0) 2021.02.16
[BOJ/Java] 17406 : 배열 돌리기4  (0) 2021.02.16
[BOJ/Java] 16926 : 배열 돌리기1  (0) 2021.02.16
[BOJ/Java] 20055 : 컨베이어 벨트 위의 로봇  (0) 2021.02.10