๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/13459)
<๊ตฌ์ฌ ํ์ถ >
๋ฌธ์ ํ์ด
bfs๋ฅผ ํ์ฉํ์ฌ ๊ตฌ์ฌ์ ์ํ์ข์ฐ๋ก ์์ง์ธ๋ค. ์ด๋ํ ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ด ๊ฐ์ ์์น๋ผ๋ฉด ์์น ์กฐ์ ์ ํด์ค๋ค.
๊ฐ์ ์์น๊ฐ ์๋๋ผ๋ฉด ๊ฐ Queue์ ์ถ๊ฐํ๋ค. ์ต์ ํ์๋ฅผ ์ฐพ์ผ๋ฉด ๋ฐ๋ก ํ์ถ ํ ๋ต์ ์ถ๋ ฅํ๋ค.
- my solution (Java)
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 _13459_ {
static char map[][];
static Queue<int[]> R, B;
static int result;
static int dx[] = { -1, 1, 0, 0 };
static int dy[] = { 0, 0, -1, 1 };
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
map = new char[n][m];
result = 0;
R=new LinkedList<>();
B=new LinkedList<>();
for (int i = 0; i < n; i++) {
String s = bf.readLine();
for (int j = 0; j < m; j++) {
map[i][j] = s.charAt(j);
if (map[i][j] == 'R')
R.add(new int[] { i, j, 0 });
else if (map[i][j] == 'B')
B.add(new int[] { i, j, 0 });
}
}
search();
System.out.println(result);
}
private static void search() {
boolean check = false;
while (!R.isEmpty()) {
int[] R_temp = R.poll();
int[] B_temp = B.poll();
int x1, y1, x2, y2;
for (int i = 0; i < 4; i++) {
int temp = R_temp[2] + 1;
if(temp>10) break; // 10๋ฒ ์ดํ๊ฐ ์๋๋ฉด x
x1=R_temp[0];
y1=R_temp[1];
check=false;
while (true) { // ๋นจ๊ฐ ๊ตฌ์ฌ
x1 +=dx[i];
y1 +=dy[i];
if (map[x1][y1] == '#') {
break;
}
if (map[x1][y1] == 'O') { // ๊ตฌ๋ฉ
check = true;
break;
}
}
x2=B_temp[0];
y2=B_temp[1];
while (true) { // ํ๋ ๊ตฌ์ฌ
x2 +=dx[i];
y2 += dy[i];
if(map[x2][y2]=='O') { // ํ๋๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์คํจ
result=0;
break;
}
if (map[x2][y2] == '#') {
if (x1 == x2 && y1 == y2) { // ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ ์ขํ๊ฐ ๊ฐ์ผ๋ฉด ์์น ์กฐ์
if (i == 0) {
if (B_temp[0] < R_temp[0]) {
x2 -= dx[i];
x1 = x2 - dx[i];
} else {
x1 -= dx[i];
x2 = x1 - dx[i];
}
} else if (i == 1) {
if (B_temp[0] < R_temp[0]) {
x1 -= dx[i];
x2 = x1 - dx[i];
} else {
x2 -= dx[i];
x1 = x2 - dx[i];
}
} else if (i == 2) {
if (B_temp[1] < R_temp[1]) {
y2 -= dy[i];
y1 = y2 - dy[i];
} else {
y1 -= dy[i];
y2 = y1 - dy[i];
}
} else {
if (B_temp[1] < R_temp[1]) {
y1 -= dy[i];
y2 = y1 - dy[i];
} else {
y2 -= dy[i];
y1 = y2 - dy[i];
}
}
}else {
x1-=dx[i];
y1-=dy[i];
x2-=dx[i];
y2-=dy[i];
if(check) { // ์ต์ ํ์
result=1;
break;
}
}
if(!(R_temp[0]==x1 && R_temp[1]==y1 && B_temp[0]==x2 && B_temp[1]==y2)) {
R.add(new int[] { x1, y1, temp });
B.add(new int[] { x2, y2, temp });
}
break;
}
}
if(result==1)break;
}
if(result==1)break;
}
}
}
- ๋ณ์ ์ค๋ช
- map: ๋ณด๋
- R, B: ๊ฐ๊ฐ ๋นจ๊ฐ ๊ตฌ์ฌ, ํ๋ ๊ตฌ์ฌ์ [x ์ขํ, y ์ขํ, count]
- result: ์ต์ ํ์
- check: ๋นจ๊ฐ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ ์ฌ๋ถ ํ์ธ
- main
- ๋ณด๋ ์ ๋ ฅ ํ ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ์์น๋ฅผ ๊ฐ queue์ ์ ์ฅ
- search ํจ์ ํธ์ถ
- result ์ถ๋ ฅ
- search
- ๋นจ๊ฐ ๊ตฌ์ฌ queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
- ๊ฐ๊ฐ ๊ตฌ์ฌ queue์์ ํ๋์ฉ ๋ฝ์ ํ ์ํ์ข์ฐ ์ด๋
- ๋นจ๊ฐ ๊ตฌ์ฌ์ ์์ง์ด๋ฉฐ ๋ ์ด์ ์ด๋ํ ์ ์๋ ์์น๋ผ๋ฉด ํ์ถ
- ๊ตฌ๋ฉ์ ๋น ์ก๋ค๋ฉด check๋ฅผ true๋ก ๋ฐ๊พผ ํ ํ์ถ
- ํ๋ ๊ตฌ์ฌ์ ์์ง์ด๋ฉฐ ๊ตฌ๋ฉ์ ๋น ์ก๋ค๋ฉด result๋ฅผ 0์ผ๋ก ๋ฐ๊พผ ํ ํ์ถ
- ํ๋ ๊ตฌ์ฌ์ด ๋ ์ด์ ์ด๋ํ ์ ์๋ ์์น์ด๊ณ ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ ์ขํ๊ฐ ๊ฐ๋ค๋ฉด ๊ฐ๊ฐ ์์น ์กฐ์ (์๋ฅผ ๋ค์ด ์๋ก ์์ง์ธ ๊ฒฝ์ฐ ํ๋ ๊ตฌ์ฌ์ด ๋ ์์ ์๋ค๋ฉด ํ๋ ๊ตฌ์ฌ๋ณด๋ค ๋นจ๊ฐ ๊ตฌ์ฌ์ด ํ ์นธ ๋ ๋ฐ์ ์๋๋ก ์กฐ์ ) but ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ ์ขํ๊ฐ ๊ฐ์ง ์๋ค๋ฉด ๋นจ๊ฐ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง ์ง ํ์ธ ํ ๋น ์ก์ผ๋ฉด ํ์ถ! ๊ตฌ๋ฉ์ ๋น ์ง์ง ์์๋ค๋ฉด ์ด๋ํ๊ธฐ ์ ์์น์ ๋น๊ตํด์ ๊ฐ์ง ์์ ๊ฒฝ์ฐ์๋ง queue์ ์ ์ฅ
์๊ฐ๐ค
๊ตฌ์ฌ ํ์ถ 2 ๋ฌธ์ ์ ๋๊ฐ์ด ํ๋ ค๋ค๊ฐ ์๊ฐ์ ์ค์ด๊ณ ์ถ์ด์ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ํ์๋ค. ๊ทธ ๊ฒฐ๊ณผ ์๊ฐ์ ๋จ์ถํ ์ ์์๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 12919_A์ B 2 (0) | 2022.12.22 |
---|---|
[Baekjoon] 15644_๊ตฌ์ฌ ํ์ถ 3 (0) | 2022.12.21 |
[Baekjoon] 13460_๊ตฌ์ฌ ํ์ถ 2 (0) | 2022.12.19 |
[Baekjoon] 4179_๋ถ! (0) | 2022.12.16 |
[Baekjoon] 16953_A โ B (0) | 2022.12.14 |