끄적끄적 코딩
article thumbnail
Published 2023. 4. 1. 02:24
[Java] 백준 2636번 치즈 알고리즘
728x90

시뮬레이션 문제입니다.
치즈가 몇초 동안 존재하는지와 없어지기 전 최종 치즈의 수를 출력해야 합니다.

입력받은 크기 +2의 map을 만들어줍니다.
이렇게 만들 경우 map의 테두리가 생기게 되고 이 테두리위치를 시작으로 DFS를 돌려주었습니다.
치즈가 닿을 경우 해당 위치를 녹아없어질 치즈로 처리해줍니다.
모든 테두리에서 DFS를 돌려 녹아 없어질 치즈를 찾았다면 해당 치즈들을 없애줍니다.

위의 과정을 반복해서 치즈가 모두 없어질 때 까지 계속합니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	static int n;
	static int m;
	static int[][] map;
	static int[][] visit;
	static int prevCnt = 0;
	static int ans = 0;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());

		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		map = new int[n + 2][m + 2];
		visit = new int[n + 2][m + 2];

		for (int i = 1; i <= n; ++i) {
			st = new StringTokenizer(br.readLine());
			for (int j = 1; j <= m; ++j) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}

		while (true) {
			for (int i = 0; i <= n + 1; ++i) {
				for (int j = 0; j <= m + 1; ++j) {
					if (i == 0 || j == 0 || i == n + 1 || j == m + 1) {
						DFS(i, j);
					}
				}
			}
			int cnt = 0;
			for (int i = 0; i <= n + 1; ++i) {
				for (int j = 0; j <= m + 1; ++j) {
					if(visit[i][j] == 1 && map[i][j] == 1) {
						map[i][j] = 0;
						++cnt;
					}
					visit[i][j] = 0;
				}
			}
			if(cnt == 0) {
				break;
			}
			prevCnt = cnt;
			++ans;
		}

		bw.write(ans + "\n");
		bw.write(prevCnt + "\n");
		bw.close();
	}

	public static void DFS(int y, int x) {
		int[] dy = { 0, 1, 0, -1 };
		int[] dx = { 1, 0, -1, 0 };

		for (int i = 0; i < 4; ++i) {
			int nextY = y + dy[i];
			int nextX = x + dx[i];

			if (nextY < 0 || nextX < 0 || nextY > n + 1 || nextX > m + 1 || visit[nextY][nextX] == 1) {
				continue;
			}
			visit[nextY][nextX] = 1;
			if (map[nextY][nextX] == 1) {
			} else if (map[nextY][nextX] == 0) {
				DFS(nextY, nextX);
			}
		}
	}
}

'알고리즘' 카테고리의 다른 글

[Java] 백준 2573번 빙산  (0) 2023.04.03
[Java] 백준 20040번 사이클 게임  (0) 2023.04.03
[Java] 백준 5430번 AC  (0) 2023.04.01
[Java] 백준 12865번 평범한 배낭  (0) 2023.04.01
[Java] 백준 3096번 영화제  (0) 2023.03.27

검색 태그