코드굽는 타자기

Baekjoon[7569] - 토마토 본문

알고리즘/깊이&너비 우선 탐색(DFS&BFS)

Baekjoon[7569] - 토마토

bright-jun 2020. 2. 14. 19:09

링크

Baekjoon[7569]

문제설명

  • BFS

문제풀이

  • BFS

문제코드

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main7569 {
    public static int[][] dir = {
        {0,0,1},
        {0,0,-1},
        {0,1,0},
        {0,-1,0},
        {1,0,0},
        {-1,0,0}
    };

    public static void main(String[] args) throws IOException {
        System.setIn(new FileInputStream("res/baekjoon/7569.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
//        입력
        int C = Integer.parseInt(st.nextToken());
        int R = Integer.parseInt(st.nextToken());
        int H = Integer.parseInt(st.nextToken());
        int[][][] map = new int[H][R][C];

        int ans=0;

        for (int i = 0; i < H; i++) {
            for (int j = 0; j < R; j++) {
                st = new StringTokenizer(br.readLine());
                for (int k = 0; k < C; k++) {
                    map[i][j][k] = Integer.parseInt(st.nextToken());
                }
            }
        }
//        BFS탐색
        LinkedList<int[]> q = new LinkedList<>();
//        초기 토마토 위치
        for (int i = 0; i < H; i++) {
            for (int j = 0; j < R; j++) {
                for (int k = 0; k < C; k++) {
                    if(map[i][j][k]==1) {
                        q.add(new int[] {i,j,k});
                    }
                }
            }
        }
//        BFS    
        int qsize;
        int[] now;
        int nh;
        int nr;
        int nc;
        while(!q.isEmpty()) {
            qsize = q.size();
            for (int i = 0; i < qsize; i++) {
                now = q.poll();
                for (int d = 0; d < 6; d++) {
                    nh = now[0] + dir[d][0];
                    nr = now[1] + dir[d][1];
                    nc = now[2] + dir[d][2];
//                    경계 안에서 다음 토마토가 익을 수 있을 때,
                    if(nh>=0 && nh<H && nr>=0 && nr<R && nc>=0 && nc<C && map[nh][nr][nc]==0) {
                        map[nh][nr][nc]=1;
                        q.add(new int[] {nh,nr,nc});
                    }
                }
            }
            ans++;
        }
        ans--;

        top:
        for (int i = 0; i < H; i++) {
            for (int j = 0; j < R; j++) {
                for (int k = 0; k < C; k++) {
                    if(map[i][j][k]==0) {
                        ans=-1;
                        break top;
                    }
                }
            }
        }
        System.out.println(ans);
//        초기화
    }
}

아쉬운점

  • BFS할때 visit 처리안했음

잘한점

  • 3차원 입력받음
  • BFS함

다른풀이

  • 퍼질 때 1씩 더한 값을 넣어주면 최대값이 시간이다
Comments