헝D의 일기장
article thumbnail

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

 

4963번: 섬의 개수

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

www.acmicpc.net

 

 

나의풀이

import java.util.*;
import java.io.*;
public class Main {
    static int[] dx = {-1,1,0,0,1,1,-1,-1};//대각선으로도 갈 수 있다는걸 고려
    static int[] dy = {0,0,1,-1,-1,1,-1,1};
    
    public static class Node{
        int x,y;
        public Node(int x, int y){
            this.x=x;
            this.y=y;
        }
    }
    
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        int answer=0;
        int w=1, h=1;
        while(true){
            st = new StringTokenizer(br.readLine());
            w= Integer.parseInt(st.nextToken());//너비
            h= Integer.parseInt(st.nextToken());//높이
            if( w==0 && h==0){
                break;
            }
            int[][] map = new int[h][w];
            
            for(int i=0; i<h; i++){
                st = new StringTokenizer(br.readLine());
                for(int j=0; j<w; j++){
                    int temp = Integer.parseInt(st.nextToken());
                    map[i][j]=temp;
                }
            }


            boolean[][] visited=new boolean[h][w];
            for(int i=0; i<h; i++){
                for(int j=0; j<w; j++){
                    if(visited[i][j] == false && map[i][j] == 1){
                        Queue<Node> q = new LinkedList<>();
                        Node now = new Node(i,j);
                        q.offer(now);
                        visited[i][j]=true;
                        
                        while(!q.isEmpty()){
                            now=q.poll();
                            for(int k=0; k<8; k++){
                                int nextX=now.x+dx[k];
                                int nextY=now.y+dy[k];

                                if(nextX<0 || nextY<0 || nextX>= h || nextY >= w){
                                    continue;
                                }
                                
                                if(visited[nextX][nextY] == true || map[nextX][nextY] == 0){
                                    continue;
                                }
                                q.offer(new Node(nextX, nextY));
                                visited[nextX][nextY]= true;
                            }
                        }
                        
                        answer++;
                        
                    }
                }
            }
            bw.write(Integer.toString(answer)+"\n");
            answer=0;
        }
        
        bw.flush();
        br.close();
        bw.close();
        
        
    }
}
profile

헝D의 일기장

@헝D

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!