-
[백준] 2638 치즈ALGORITHM/BOJ 2020. 10. 29. 21:48
2638번: 치즈
첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5≤N, M≤100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로 표
www.acmicpc.net
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); } }
더 좋은 방법이 있을 것 같긴 하지만,,, 생각나는대로 막 짜다 보니 조금 더러운 느낌이다.
맨처음에 이 치즈 문제인줄 알았다. 작년에 분명 풀었던걸로 기억하는데 푼 흔적이 없어서 이상했는데, 문제가 살짝 다르다.
2636번: 치즈
첫째 줄에는 사각형 모양 판의 세로와 가로의 길이가 양의 정수로 주어진다. 세로와 가로의 길이는 최대 100이다. 판의 각 가로줄의 모양이 윗 줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진
www.acmicpc.net
'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