Skip to content

Commit cadb7f3

Browse files
authored
Merge pull request #248 from AlgorithmWithGod/lkhyun
[20250317] BOJ / 골드2 / 통나무 옮기기 / 이강현
2 parents 19900f9 + 9290e24 commit cadb7f3

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
```java
2+
import java.util.*;
3+
import java.io.*;
4+
class Node{
5+
int i;
6+
int j;
7+
int turn;
8+
int count;
9+
10+
Node(int i,int j,int turn,int count){
11+
this.i = i;
12+
this.j = j;
13+
this.turn = turn;
14+
this.count = count;
15+
}
16+
}
17+
public class Algo3_이강현 {
18+
19+
static int N;
20+
static char[][] grid;
21+
static int[] di = {0,-1,0,0,1};
22+
static int[] dj = {0,0,-1,1,0};
23+
static int min = Integer.MAX_VALUE;
24+
25+
public static void main(String[] args)throws Exception{
26+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
27+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
28+
N = Integer.parseInt(br.readLine());
29+
grid = new char[N][N];
30+
31+
int starti = 0;
32+
int startj = 0;
33+
int turn = 0; // 0은 가로, 1은 세로
34+
for(int i=0;i<N;i++) {
35+
char[] str = br.readLine().toCharArray();
36+
for(int j=0;j<N;j++) {
37+
if(str[j]=='B' && starti == 0 && startj == 0) {
38+
if(j+1<N && str[j+1] == 'B') { // 가로일 경우
39+
starti = i;
40+
startj = j+1;
41+
turn = 0;
42+
} else { // 세로일 경우
43+
starti = i+1;
44+
startj = j;
45+
turn = 1;
46+
}
47+
}
48+
grid[i][j] = str[j];
49+
}
50+
}
51+
BFS(starti,startj,turn);
52+
if(min == Integer.MAX_VALUE){
53+
bw.write("0");
54+
}else{
55+
bw.write(min+"");
56+
}
57+
58+
bw.close();
59+
}
60+
public static void BFS(int starti, int startj, int turn) {
61+
ArrayDeque<Node> q = new ArrayDeque<>();
62+
// 3차원 방문 배열: visited[i][j][0]는 가로, visited[i][j][1]은 세로 상태
63+
boolean[][][] visited = new boolean[N][N][2];
64+
65+
q.add(new Node(starti, startj, turn, 0));
66+
visited[starti][startj][turn] = true;
67+
68+
while(!q.isEmpty()) {
69+
Node cur = q.poll();
70+
71+
// 종료 조건: 목표 'E'에 도달한 경우
72+
if(cur.turn == 0) { // 가로일 때
73+
if(cur.j-1 >= 0 && cur.j+1 < N) {
74+
if(grid[cur.i][cur.j-1] == 'E' && grid[cur.i][cur.j] == 'E' && grid[cur.i][cur.j+1] == 'E')
75+
min = Math.min(min, cur.count);
76+
}
77+
} else { // 세로일 때
78+
if(cur.i-1 >= 0 && cur.i+1 < N) {
79+
if(grid[cur.i-1][cur.j] == 'E' && grid[cur.i][cur.j] == 'E' && grid[cur.i+1][cur.j] == 'E')
80+
min = Math.min(min, cur.count);
81+
}
82+
}
83+
84+
for(int k = 0; k < 5; k++) {
85+
int newi = cur.i + di[k];
86+
int newj = cur.j + dj[k];
87+
if(cur.turn == 0) { // 가로 상태일 때
88+
if(newi < 0 || newi >= N || newj - 1 < 0 || newj + 1 >= N) continue;
89+
if(grid[newi][newj] == '1' || grid[newi][newj-1] == '1' || grid[newi][newj+1] == '1') continue;
90+
if(k == 0) { // 회전: 가로 -> 세로
91+
if(newi - 1 < 0 || newi + 1 >= N) continue;
92+
if(grid[newi-1][newj-1]=='1' || grid[newi-1][newj]=='1' || grid[newi-1][newj+1]=='1' ||
93+
grid[newi+1][newj-1]=='1' || grid[newi+1][newj]=='1' || grid[newi+1][newj+1]=='1')
94+
continue;
95+
if(!visited[newi][newj][1]){
96+
q.add(new Node(newi, newj, 1, cur.count + 1));
97+
visited[newi][newj][1] = true;
98+
}
99+
} else if(!visited[newi][newj][cur.turn]) { // 단순 이동
100+
q.add(new Node(newi, newj, cur.turn, cur.count + 1));
101+
visited[newi][newj][cur.turn] = true;
102+
}
103+
104+
} else { // 세로 상태일 때
105+
if(newi - 1 < 0 || newi + 1 >= N || newj < 0 || newj >= N) continue;
106+
if(grid[newi][newj] == '1' || grid[newi-1][newj] == '1' || grid[newi+1][newj] == '1') continue;
107+
if(k == 0) { // 회전: 세로 -> 가로
108+
if(newj - 1 < 0 || newj + 1 >= N) continue;
109+
if(grid[newi-1][newj-1]=='1' || grid[newi][newj-1]=='1' || grid[newi+1][newj-1]=='1' ||
110+
grid[newi-1][newj+1]=='1' || grid[newi][newj+1]=='1' || grid[newi+1][newj+1]=='1')
111+
continue;
112+
if(!visited[newi][newj][0]){
113+
q.add(new Node(newi, newj, 0, cur.count + 1));
114+
visited[newi][newj][0] = true;
115+
}
116+
} else if(!visited[newi][newj][cur.turn]) { // 단순 이동
117+
q.add(new Node(newi, newj, cur.turn, cur.count + 1));
118+
visited[newi][newj][cur.turn] = true;
119+
}
120+
}
121+
}
122+
}
123+
}
124+
125+
}
126+
127+
```

0 commit comments

Comments
 (0)