알고리즘(BOJ)/Silver
1012 - 유기농배추(BFS)
ch.0
2022. 12. 23. 03:50
package test;
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 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
Queue<int[]> q = new LinkedList<>();
// TestCase
for (int testcase = 0; testcase < T; testcase++) {
int count = 0;
// 가로 세로 배추
st = new StringTokenizer(br.readLine(), " ");
int wide = Integer.parseInt(st.nextToken());
int depth = Integer.parseInt(st.nextToken());
int beachu = Integer.parseInt(st.nextToken());
// 배열
int[][] array = new int[depth][wide];
boolean[][] visited = new boolean[depth][wide];
// 배추 위치
for (int i = 0; i < beachu; i++) {
st = new StringTokenizer(br.readLine(), " ");
int y = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
array[x][y] = 1;
}
// 배추 찾기
for (int i = 0; i < depth; i++) {
for (int j = 0; j < wide; j++) {
int value = array[i][j];
if (visited[i][j] == false && value == 1) {
q.offer(new int[] { i, j });
while (!q.isEmpty()) {
int[] point = q.poll();
int x = point[0];
int y = point[1];
value = array[x][y];
if (value == 0) {
visited[x][y] = true;
} else if (visited[x][y] == false && value == 1) {
visited[x][y] = true;
if (y + 1 < wide) {
q.offer(new int[] { x, y + 1 });
}
if (y - 1 >= 0) {
q.offer(new int[] { x, y - 1 });
}
if (x + 1 < depth) {
q.offer(new int[] { x + 1, y });
}
if (x -1 >=0) {
q.offer(new int[] { x - 1, y });
}
}
}
count++;
} else if (value == 0) {
visited[i][j] = true;
}
}
}
System.out.println(count);
}
}
}
문제풀이
KeyPoint: 1일때만 로직이 작동하고 (0일때는 방문여부만 체크하고 패스) 해당위치에서 방문하지 않은 4방향위치를 큐에 담는다
큐를 꺼내서 해당위치가 1이면 다시 4방향을하고 0이면 패스 / 주변이 다 0이되면 그때 count++ 해준다.