알고리즘/백준
[BOJ] 2573 - 빙산 (Java)
DeveloperJason
2023. 8. 20. 13:10
접근법
구현문제. 문제가 원하는 조건에 맞게 구현을 잘하면 된다.
내가 중요하게 생각했던 부분은
- bfs로 구현할 때 주변에 중복되지 않으면서 0이 아닌 빙산이 주어진다면 queue에 집어넣는다.
- 0이 주어진다면 방금 녹은건지 아닌지를 판단해야 한다.
이 둘 모두를 visited로 처리할 수 있다.
코드
package BOJ;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
public class BOJ_2573_빙산 {
static boolean[][] visited;
static int N, M;
static int[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.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(br.readLine());
for (int j = 0; j < M; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
// 빡구현하면 될 것 같음
// 빡구현 하고 매번 줄어들 때 마다 dfs나 bfs로 확인하면서 visited 체크하고
// 체크 안된 빙산이 있으면 바로 return 해버리는걸로
int cnt = 0;
boolean doneFlag = false;
done:
while (!doneFlag) {
doneFlag = true;
visited = new boolean[N][M];
boolean flag = false;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (arr[i][j] != 0 && !visited[i][j]) {
if (!flag) {
bfs(i, j);
doneFlag = false;
flag = true;
} else {
break done;
}
}
}
}
cnt++;
}
if (doneFlag) {
System.out.println(0);
} else {
System.out.println(cnt);
}
}
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static void bfs(int x, int y) {
Queue<int[]> queue = new ArrayDeque<>();
queue.offer(new int[]{x, y});
visited[x][y] = true;
while (!queue.isEmpty()) {
int[] tmp = queue.poll();
for (int i = 0; i < 4; i++) {
int nx = tmp[0] + dx[i];
int ny = tmp[1] + dy[i];
if (0 <= nx && nx < N && 0 <= ny && ny < M && !visited[nx][ny]) {
if (arr[nx][ny] == 0) {
if (arr[tmp[0]][tmp[1]] != 0)
arr[tmp[0]][tmp[1]] -= 1;
} else {
queue.offer(new int[]{nx, ny});
visited[nx][ny] = true;
}
}
}
}
}
}
결과
메모리 | 시간 | 언어 |
77444KB | 492ms | Java |