본문 바로가기

알고리즘

[Softeer] 장애물 인식 프로그램 (JAVA)

https://softeer.ai/practice/info.do?idx=1&eid=409&sw_prbl_sbms_sn=139968 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

import java.util.*;
import java.io.*;


class Position{
    int x;
    int y;
    Position(int x, int y){
        this.x = x;
        this.y = y;
    }
}

public class Main
{

    static int N;
    static int[][] map;
    static int answer;
    static Queue<Position> queue;
    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,-1,1};
    static ArrayList<Integer> blocks;


    static void count(int x, int y){
        
        queue.add(new Position(x,y));
        map[x][y]=2;
        int cnt=1;

        while(!queue.isEmpty()){
            Position tmp = queue.poll();
            for(int i=0;i<4;i++){
                int nx = tmp.x+dx[i];
                int ny = tmp.y+dy[i];
                if(isIn(nx,ny)&&map[nx][ny]==1){
                    queue.add(new Position(nx,ny));
                    cnt++;
                    map[nx][ny]=2; //방문처리
                }
            }
        }
        //queue가 비었으면 장애물 하나 끝
        answer++;
        blocks.add(cnt);

    }

    static boolean isIn(int x, int y){
        if(x<0||x>=N||y<0||y>=N) return false;
        return true;
    }

    public static void main(String args[]) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        map = new int[N][N];
        queue = new LinkedList<>();
        blocks = new ArrayList<>();
        answer = 0;

        for(int i=0;i<N;i++){
            String tmp = br.readLine();
            for(int j=0;j<N;j++){
                map[i][j] = Character.getNumericValue(tmp.charAt(j));
            }
        }
        

        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                if(map[i][j]==1){
                    count(i,j);
                }
            }
        }

        //장애물 블록수, 블록에 속하는 장애물의 수 오름차순 정렬 출력

        System.out.println(answer);
        int[] answerList = new int[answer];
        for(int i=0;i<answer;i++){
            answerList[i] = blocks.get(i);
        }

        Arrays.sort(answerList);
        for(int x:answerList){
            System.out.println(x);
        }
        
    }
}

백준에 단지번호 붙이기랑 같은 문제인듯하다. 단지번호 붙이기는 실버 1!