문제 - https://www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

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

public class Main {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static StringTokenizer st;

    static boolean done = false;
    static boolean[][] already;
    static int N, M, D = -1;
    static int[] dr = {-1, 0, 1, 0};
    static int[] dc = {0, 1, 0, -1};
    static int[][] arr;
    static class Pos{
        int r, c;
        public Pos(int r, int c){
            this.r = r;
            this.c = c;
        }
    }
    static ArrayList<Pos> pre, post;

    public static void main(String[] args) throws IOException {

        st = new StringTokenizer(br.readLine());
        M = Integer.parseInt(st.nextToken());
        N = Integer.parseInt(st.nextToken());

        arr = new int[N][M];
        already = new boolean[N][M];
        pre = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < M; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
                if (arr[i][j] == 1) pre.add(new Pos(i, j));
            }
        }

        while(!done){
            check();
            flow();
            if(pre.isEmpty() && !done){
                D = -1;
                break;
            }
            D++;
        }
        bw.write(D+"\n");

        br.close();
        bw.flush();
        bw.close();
    }
    static void check(){
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (arr[i][j] == 0) return;
            }
        }
        done = true;
    }
    static void flow(){
        post = new ArrayList<>();
        for(Pos point : pre){
            int r = point.r;
            int c = point.c;
            already[r][c] = true;
            for (int w = 0; w < 4; w++) {
                int nr = r + dr[w];
                int nc = c + dc[w];
                if (0<=nr && nr<N && 0<=nc && nc<M && arr[nr][nc]==0 && !already[nr][nc]){
                    arr[nr][nc] = 1;
                    post.add(new Pos(nr, nc));
                    already[nr][nc] = true;
                }
            }
        }
        pre = post;
    }
}

입사 후 처음으로 시간을 내서 문제를 풀어봤는데... 쉬운 문제임에도 불구하고 뭔가 코드가 낯설게 느껴졌다. 다시금 PS에서는 꾸준함이 중요하다는걸 느끼는 순간이었다. 바빠도 꾸준히 풀어보려고 노력해야겠다!

'공부 > algorithm' 카테고리의 다른 글

BOJ 배열 돌리기 4(17406) - Java  (0) 2022.01.29
BOJ N번째 큰 수(2075) - Java  (0) 2021.12.23
BOJ 연구소 3(17142) - Java  (0) 2021.11.18
BOJ 빙산(2573) - Java  (0) 2021.11.18
BOJ 나무 재테크(16235) - Java  (0) 2021.11.17

+ Recent posts