-
[백준] 2638 치즈ALGORITHM/BOJ 2020. 10. 29. 21:48
2020.10.26
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { public static int N, M, answer, arr[][]; public static int dx[] = {-1, 0, 1 ,0}; public static int dy[] = {0, -1, 0, 1}; public static boolean vtd[][]; public static Queue<int[]> q, f; public static boolean isMelting() { for(int i = 0; i < N; i++) { for(int j = 0; j < M; j++) { if(arr[i][j] == 1) return false; } } return true; } public static void melting() { for(int i = 0; i < N; i++) { for(int j = 0; j < M; j++) { if(arr[i][j] == -1) arr[i][j] = 2; } } answer++; // hour++ } public static void solve() { while(!q.isEmpty()) { int tmp[] = q.poll(); int x = tmp[0]; int y = tmp[1]; int count = 0; for(int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if(nx < 0 || ny < 0 || nx >= N || ny >= M) continue; if(arr[nx][ny] == 2) count++; } if(count >= 2) { arr[x][y] = -1; } } } public static void vtdInit() { for(int i = 0; i < N; i++) { for(int j = 0; j < M; j++) { vtd[i][j] = false; } } } public static void init() { f.add(new int[] {0,0}); arr[0][0] = 2; vtd[0][0] = true; while (!f.isEmpty()) { int tmp[] = f.poll(); int x = tmp[0]; int y = tmp[1]; for(int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if(nx < 0 || ny < 0 || nx >= N || ny >= M) continue; if((arr[nx][ny] == 0 || arr[nx][ny] == 2) && !vtd[nx][ny]) { arr[nx][ny] = 2; vtd[nx][ny] = true; f.add(new int[] {nx, ny}); } } } } public static void main(String[] args) throws Exception { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(bf.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); arr = new int[N][M]; for(int i = 0; i < N; i++) { st = new StringTokenizer(bf.readLine()); for(int j = 0; j < M; j++) { arr[i][j] = Integer.parseInt(st.nextToken()); } } answer = 0; f = new LinkedList<int[]>(); // init (2) q = new LinkedList<int[]>(); vtd = new boolean[N][M]; while(true) { vtdInit(); init(); if(isMelting()) break; // melting check for(int i = 1; i < N-1; i++) { //edge x for(int j = 1; j < M-1; j++) { if(arr[i][j] == 1) { q.add(new int[] {i, j}); } } } solve(); melting(); } System.out.println(answer); } }
더 좋은 방법이 있을 것 같긴 하지만,,, 생각나는대로 막 짜다 보니 조금 더러운 느낌이다.
맨처음에 이 치즈 문제인줄 알았다. 작년에 분명 풀었던걸로 기억하는데 푼 흔적이 없어서 이상했는데, 문제가 살짝 다르다.
'ALGORITHM > BOJ' 카테고리의 다른 글
[백준] 1149 RGB거리 (0) 2020.11.07 [백준] 2606 바이러스 (0) 2020.11.06 [백준] 13300 방 배정 (0) 2020.11.06 [백준] 14503 로봇 청소기 (0) 2020.11.03 [백준] 9095 1, 2, 3 더하기 (0) 2020.11.02