Java

[백준 2636] 치즈 (JAVA)

iheeeee6-6 2023. 3. 28. 13:51
728x90

https://www.acmicpc.net/problem/2636

 

2636번: 치즈

아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓

www.acmicpc.net

 

처음에는 0인 곳들을 큐에 넣어 bfs로 탐색하였는데, 알고보니 막혀있는 공기는 제외해야하는 것이었다.

 

따라서, (0,0)부터 탐색을 하여 0이면 큐에 넣고 1이면 잠시 2로 바꿔준 후, 다 진행한 후에 2로 된 것들을 0으로 바꿔준다.

탐색을 할때는 check배열을 통해 첫 방문지인지 확인하여 탐색한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	static int h, w, Hcount = 0, count = 0,cheese=0;
	static int cheeseTemp=0;
	static int[][] arr;
	static boolean[][] check;
	static int[] dx = { 1, -1, 0, 0 };
	static int[] dy = { 0, 0, 1, -1 };

	static Queue<Dot> q;
	
	static class Dot {
		int x, y;

		Dot(int x, int y) {
			this.x = x;
			this.y = y;
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		h = Integer.parseInt(st.nextToken());
		w = Integer.parseInt(st.nextToken());
		arr = new int[h][w];
		for (int i = 0; i < h; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < w; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
				if (arr[i][j] == 1) {
					cheese+=1;
				}
			}
		}

		while(cheese>0) {
			check = new boolean[h][w];
			bfs(0,0);
			Hcount++;
			count= cheeseTemp;
			cheese-=cheeseTemp;
			cheeseTemp=0;
		}
		

		System.out.println(Math.abs(Hcount));
		System.out.println(count);
	}

	static void bfs(int x,int y) {
		q = new LinkedList<>();
		q.add(new Dot(x,y));
		while (!q.isEmpty()) {
			Dot d = q.poll();
			find(d.x, d.y);
		}
		setZero();
	}
	static void setZero() {
		for(int i=0;i<h;i++) {
			for(int j=0;j<w;j++) {
				if(arr[i][j]==2) arr[i][j]=0;
			}
		}
	}
	static void find(int x, int y) {
		for (int i = 0; i < 4; i++) {
			int xx = x + dx[i];
			int yy = y + dy[i];
			if (xx < h && yy < w && xx >= 0 && yy >= 0&&!check[xx][yy]) {
				check[xx][yy]=true;
				if (arr[xx][yy]==0) {
					q.add(new Dot(xx, yy));
				}
				else if (arr[xx][yy] ==1) {
					arr[xx][yy] = 2;
					cheeseTemp++;
				}
			}
		}
	}

}

'Java' 카테고리의 다른 글

[백준 1107] 리모컨 (JAVA)  (0) 2023.03.29
[백준 7569] 토마토 (JAVA)  (0) 2023.03.28
[백준 1826] 연료 채우기 (JAVA)  (0) 2023.03.28
[백준 6588] 골드바흐의 추측 (JAVA)  (0) 2023.03.25
[백준 15711] 환상의 짝꿍 (JAVA)  (0) 2023.03.24