Skip to content

Commit 877d14f

Browse files
authored
[20250418] BOJ / P5 / 백조의 호수 / 이강현
1 parent af696a3 commit 877d14f

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
```java
2+
import java.io.*;
3+
import java.util.*;
4+
5+
public class Main {
6+
7+
static int r, c, starti = -1, startj = -1, endi, endj;
8+
static char[][] matrix;
9+
static boolean[][] check;
10+
static boolean[][] watercheck;
11+
static ArrayDeque<int[]> wq, sq;
12+
static int[] di = {-1, 1, 0, 0};
13+
static int[] dj = {0, 0, -1, 1};
14+
15+
public static void main(String[] args) throws IOException {
16+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
17+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
18+
StringTokenizer st = new StringTokenizer(br.readLine());
19+
r = Integer.parseInt(st.nextToken());
20+
c = Integer.parseInt(st.nextToken());
21+
matrix = new char[r][c];
22+
check = new boolean[r][c];
23+
watercheck = new boolean[r][c];
24+
wq = new ArrayDeque<>();
25+
sq = new ArrayDeque<>();
26+
27+
for (int i = 0; i < r; i++) {
28+
String line = br.readLine();
29+
for (int j = 0; j < c; j++) {
30+
matrix[i][j] = line.charAt(j);
31+
if (matrix[i][j] == 'L') {
32+
if (starti == -1 && startj == -1) {
33+
starti = i;
34+
startj = j;
35+
} else {
36+
endi = i;
37+
endj = j;
38+
}
39+
matrix[i][j] = '.';
40+
}
41+
42+
if (matrix[i][j] == '.') {
43+
wq.add(new int[] {i, j});
44+
watercheck[i][j] = true;
45+
}
46+
}
47+
}
48+
49+
sq.add(new int[] {starti, startj});
50+
check[starti][startj] = true;
51+
52+
int time = 0;
53+
while (!move()) {
54+
melting();
55+
time++;
56+
}
57+
bw.write(time + "");
58+
bw.close();
59+
}
60+
61+
public static boolean move() {
62+
ArrayDeque<int[]> q = new ArrayDeque<>();
63+
64+
while (!sq.isEmpty()) {
65+
int[] cur = sq.poll();
66+
if (cur[0] == endi && cur[1] == endj) {
67+
return true;
68+
}
69+
70+
for (int k = 0; k < 4; k++) {
71+
int newi = cur[0] + di[k];
72+
int newj = cur[1] + dj[k];
73+
74+
if (newi < 0 || newi >= r || newj < 0 || newj >= c || check[newi][newj])
75+
continue;
76+
77+
check[newi][newj] = true;
78+
if (matrix[newi][newj] == '.') {
79+
sq.add(new int[] {newi, newj});
80+
} else if (matrix[newi][newj] == 'X') {
81+
q.add(new int[] {newi, newj});
82+
}
83+
}
84+
}
85+
86+
sq = q;
87+
return false;
88+
}
89+
90+
public static void melting() {
91+
int size = wq.size();
92+
for (int i = 0; i < size; i++) {
93+
int[] cur = wq.poll();
94+
95+
for (int k = 0; k < 4; k++) {
96+
int newi = cur[0] + di[k];
97+
int newj = cur[1] + dj[k];
98+
99+
if (newi < 0 || newi >= r || newj < 0 || newj >= c || watercheck[newi][newj])
100+
continue;
101+
if (matrix[newi][newj] == 'X') {
102+
matrix[newi][newj] = '.';
103+
wq.add(new int[] {newi, newj});
104+
watercheck[newi][newj] = true;
105+
}
106+
}
107+
}
108+
}
109+
}
110+
111+
```

0 commit comments

Comments
 (0)