엄지월드

[백준] 7576 토마토(BFS) 본문

알고리즘

[백준] 7576 토마토(BFS)

킨글 2022. 7. 29. 20:43
반응형

접근 방법

  • 전체 배열을 탐색하여 BFS 시작 전에, 1이 포함된 위치를 Queue에 모두 넣어준다.
    (ArrayList<int[]> arr = new ArrayList<>();)
  • BFS 탐색 시, 범위를 벗어나지 않거나, 방문하지 않았거나, 0인 부분을 계속해서 탐색해준다. 

 

특이점

  • 기본 BFS는 0(벽)일때 continue를 해주지만, 해당 문제는 
    num이 여러개 일 수 있기 때문에 다른 num을 침범하지 않기 위해 if(map[nextX][nextY] != 0) continue; 처리해준다. 
  • 이동한 부분에서 max 값을 찾기 위해 계속해서 갱신해준다. max = Math.max(max, map[nextX][nextY]); 
package Baekjoon;

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

public class BOK_7576 {
    static int[][] map;
    static boolean[][] visited;
    static int m;
    static int n;
    static int cnt;
    static int max;
    public static void solution() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        m = Integer.parseInt(st.nextToken());
        n = Integer.parseInt(st.nextToken());
        map = new int[n][m];
        visited = new boolean[n][m];
        cnt = 0;
        max = 0;
        boolean initIsZero = false;
        for(int i=0; i<n; i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<m; j++){
                map[i][j] = Integer.parseInt(st.nextToken());
                if(map[i][j] == 0) initIsZero = true;
            }
        }

        ArrayList<int[]> arr = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if(map[i][j] == 1){
                    arr.add(new int[]{i,j});
                }
            }
        }
        bfs(arr);

        boolean isZero = false;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(map[i][j]+" ");
                if(map[i][j] == 0){
                    isZero = true;
                    break;
                }
            }
            System.out.println();
            if(isZero) break;
        }

        if(!initIsZero){
            System.out.println("0");
            return;
        }
        if(isZero){
            System.out.println("-1");
            return;
        }

        System.out.println(max-1);
    }
    public static void bfs(ArrayList<int []> position){
        Queue<int[]> q = new LinkedList<>();

        for(int i=0; i<position.size(); i++){
            q.add(new int[]{position.get(i)[0],position.get(i)[1]});
        }
        int[] dx = {-1, 1, 0, 0};
        int[] dy = {0, 0, -1, 1};
        while(!q.isEmpty()){
            int now[] = q.poll();
            int nowX = now[0];
            int nowY = now[1];

            for(int i=0; i<4; i++){
                int nextX = nowX + dx[i];
                int nextY = nowY + dy[i];
                if(nextX < 0 || nextY < 0 || nextX >= n || nextY >= m)
                    continue;
                if(map[nowX][nowY] == -1 || map[nextX][nextY] == -1 || visited[nextX][nextY])
                    continue;
                if(map[nextX][nextY] != 0) continue;

                q.add(new int[]{nextX, nextY});
                map[nextX][nextY] = map[nowX][nowY] + 1;
                visited[nextX][nextY] = true;
                if(max < map[nextX][nextY])
                    max = map[nextX][nextY];
            }
        }
    }
    public static void main(String[] args) throws IOException {
        solution();
    }
}

 

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

[백준] 5427 불(BFS)  (0) 2022.08.03
[백준] 1697 숨바꼭질(BFS)  (0) 2022.08.02
[백준] 2606 바이러스(BFS)  (0) 2022.07.27
[백준] 2178 미로 탐색 (BFS)  (0) 2022.07.27
기술면접 준비  (0) 2022.07.08
Comments