알고리즘

백준 17086번 아기 상어2 (JAVA)

박카스마시며코딩 2022. 1. 10. 16:00

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

 

17086번: 아기 상어 2

첫째 줄에 공간의 크기 N과 M(2 ≤ N, M ≤ 50)이 주어진다. 둘째 줄부터 N개의 줄에 공간의 상태가 주어지며, 0은 빈 칸, 1은 아기 상어가 있는 칸이다. 빈 칸의 개수가 한 개 이상인 입력만 주어진다.

www.acmicpc.net

 

 

저는 해당 문제를 BFS를 적용시켜 문제를 해결하였습니다. 각각의 1을 Queue에 넣어서 BFS를 진행하였고, 전체 맵을 다 방문하는데 얼마나 걸리는지를 확인하여 이를 결과값으로 출력하였습니다.

 

package BOJ.BFS;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_17086 {
    private static final int[] dy = {-1,0,1,0,-1,1,1,-1};
    private static final int[] dx = {0,1,0,-1,1,1,-1,-1};
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(st.nextToken());
        int m = stoi.apply(st.nextToken());
        int[][] map = new int[n][m];
        for(int i = 0 ; i < n ; i++){
            st = new StringTokenizer(br.readLine()," ");
            for(int j = 0 ; j < m ; j++){
                map[i][j] = stoi.apply(st.nextToken());
            }
        }
        int result = bfs(map,n,m);
        System.out.println(result);
    }

    private static int bfs(int[][] map, int n, int m) {
        Queue<int[]> q = new LinkedList<>();
        boolean[][]  visited = new boolean[n][m];
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < m ; j++){
                if(map[i][j] == 1){
                    q.offer(new int[] {i,j});
                    visited[i][j] = true;
                }
            }
        }
        int time = -1;
        while(!q.isEmpty()){
            int size = q.size();
            for(int s = 0 ; s < size ; s++){
                int[] now = q.poll();
                for(int i = 0 ; i < 8 ; i++){
                    int ny = now[0] + dy[i];
                    int nx = now[1] + dx[i];
                    if(nx >= 0 && nx < m && ny >= 0 && ny < n && !visited[ny][nx]){
                        q.offer(new int[]{ny,nx});
                        visited[ny][nx] = true;
                    }
                }
            }
            time++;
        }
        return time;
    }
}

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

백준 16197번 두 동전 (JAVA)  (0) 2022.01.16
백준 15486번 퇴사2 (JAVA)  (0) 2022.01.13
백준 1939번 중량제한 (JAVA)  (0) 2022.01.07
백준 1789번 수들의 합 (JAVA)  (0) 2022.01.05
백준 14179번 빗물 (JAVA)  (0) 2022.01.04