본문 바로가기
알고리즘/백준 - 실버

백준 4963 섬의 개수

by 호롤롤로루야 2021. 9. 6.

백준 4963 섬의 개수

1. 문제 링크

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

 

4963번: 섬의 개수

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

www.acmicpc.net

 

2. 문제 해결에 대한 아이디어

1. Input으로 받은 2차원 배열을 순회하면서 1로 되어 있는 위치에서 BFS를 수행한다.

2. BFS를 수행한 카운트를 출력한다.

3. 대각선도 접근할 수 있는 것을 간과하면 안 된다.

 

3. 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
	static int W, H;
	static int[][] board;
	static boolean[][] visited;
	static int count;
	static int[] dirY = { 0, 0, 1, -1, 1, 1, -1, -1 };
	static int[] dirX = { 1, -1, 0, 0, 1, -1, 1, -1 };
	static Queue<Pair> q;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		while (true) {
			String[] wh = br.readLine().split(" ");
			W = Integer.parseInt(wh[0]);
			H = Integer.parseInt(wh[1]);

			if (W == 0 && H == 0)
				return;

			board = new int[H][W];
			visited = new boolean[H][W];
			q = new LinkedList<>();
			count = 0;

			for (int i = 0; i < H; i++) {
				String[] lines = br.readLine().split(" ");
				for (int j = 0; j < W; j++) {
					board[i][j] = Integer.parseInt(lines[j]);
					if (board[i][j] == 1)
						q.add(new Pair(i, j));
				}
			}

			while (!q.isEmpty()) {
				Pair target = q.poll();
				if (visited[target.y][target.x])
					continue;
				BFS(target);
				++count;
			}

			System.out.println(count);
		}
	}

	public static void BFS(Pair p) {
		Queue<Pair> tq = new LinkedList<>();
		tq.add(p);

		while (!tq.isEmpty()) {
			Pair now = tq.poll();
			int x = now.x;
			int y = now.y;
			for (int i = 0; i < 8; i++) {
				int yy = y + dirY[i];
				int xx = x + dirX[i];
				if (xx < 0 || yy < 0 || xx >= W || yy >= H || visited[yy][xx] || board[yy][xx] != 1)
					continue;
				tq.add(new Pair(yy, xx));
				visited[yy][xx] = true;

			}
		}
	}

}

class Pair {
	public int y, x;

	public Pair(int y, int x) {
		super();
		this.y = y;
		this.x = x;
	}

}
 

4. 채점 결과

 

5. 느낀 점

1. 기본적인 BFS 문제에서 대각선 방향까지 고려하는 문제였다.

 

'알고리즘 > 백준 - 실버' 카테고리의 다른 글

백준 6603 로또  (0) 2021.12.27
백준 7576 토마토  (0) 2021.09.07
백준 1012 유기농 배추  (0) 2021.09.06
백준 2468 안전 영역  (0) 2021.09.03
백준 2178 미로 탐색  (0) 2021.09.03

댓글