알고리즘

백준 No.4963 섬의 개수- JAVA

jaewoo 2023. 4. 8. 13:55

문제

정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오

한 정사각형과 가로,세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다.

두 정사각형이 같은 섬에 있으려면 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러싸여 있으며, 지도 밖으로 나갈 수 없다.

 

1 1
0
2 2
0 1
1 0
3 2
1 1 1
1 1 1
5 4
1 0 1 0 0
1 0 0 0 0
1 0 1 0 1
1 0 0 1 0
5 4
1 1 1 0 1
1 0 1 0 1
1 0 1 0 1
1 0 1 1 1
5 5
1 0 1 0 1
0 0 0 0 0
1 0 1 0 1
0 0 0 0 0
1 0 1 0 1
0 0

 

 

풀이

bfs로 풀었는데 주의할 게 처음에 dx, dy 배열을 4자리로 했는데 그러면 상하좌우만 계속 탐색하여 답과 다르게 출력된다. 그래서 대각선을 추가하기 위해 8자리로 늘려야한다. 상 하 좌 우 대각선 우하,우상,좌하,좌우  이렇게 하는데 순서는 상관없지만 대각선은 각 4개를 다 갈 수 있도록 만들어줘야한다. 

static int dx[] =  {0, 0, -1 ,1, -1, 1, -1, 1};
static int dy[] = {-1, 1, 0, 0, 1, 1, -1, -1};

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

public class Main {


    static boolean visited[][];
    static int map[][];
    static int W;
    static int H;
    static int dx[] =  {0, 0, -1 ,1, -1, 1, -1, 1};
    static int dy[] = {-1, 1, 0, 0, 1, 1, -1, -1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb =new StringBuilder();
        String str;
        while( !(str = br.readLine()).equals("0 0") ) {
            st = new StringTokenizer(str);

            W = Integer.parseInt(st.nextToken());
            H = Integer.parseInt(st.nextToken());



            map = new int[H][W];
            visited = new boolean[H][W];
            for (int i = 0; i < H; i++) {
                String temp = br.readLine();
                st = new StringTokenizer(temp);
                for (int j = 0; j < W; j++) {
                    map[i][j] = Integer.parseInt(st.nextToken());
                }
            }

            int count = 0;
            for (int i = 0; i < H; i++) {
                for (int j = 0; j < W ; j++) {
                    if (!visited[i][j] && map[i][j] == 1){
                        bfs(i,j);
                        count++;
                    }
                }
            }
            sb.append(count).append("\n");
        }
        System.out.println(sb);
    }

    public static void bfs(int h,int w){
        Queue<Node> queue = new LinkedList<>();
        queue.add(new Node(h,w));
        visited[h][w] = true;

        while (!queue.isEmpty()){
            Node now = queue.poll();

            for (int i = 0; i < 8 ; i++) {
                int nextH = now.h + dy[i];
                int nextW = now.w + dx[i];

                if(nextW >= 0 && nextW < W && nextH >= 0 && nextH < H){
                    if(!visited[nextH][nextW] && map[nextH][nextW] == 1){
                        visited[nextH][nextW] = true;
                        queue.add(new Node(nextH,nextW));
                    }
                }
            }
        }
    }


    static class Node{
        int h;
        int w;

        public Node(int h,int w){
            this.h = h;
            this.w = w;
        }
    }
}

'알고리즘' 카테고리의 다른 글

백준 No.1057 토너먼트- JAVA  (0) 2023.04.14
백준 No.1058 친구- JAVA  (0) 2023.04.12
백준 No.4796 캠핑- JAVA  (0) 2023.04.07
백준 No.9012 괄호- JAVA  (0) 2023.04.06
백준 No.10816 숫자카드2- JAVA  (0) 2023.04.04