문제 - 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 |