[PS] 99ํด๋ฝ ์ฝํ ์คํฐ๋ 33์ผ์ฐจ TIL (๋ฆฌ์ฝ์ณ ๋ก๋ด)
ํ๊ทธ: 99ํด๋ฝ, BFS/DFS, PS, TIL, ๊ทธ๋ํ, ์ฝ๋ฉํ ์คํธ์ค๋น, ํญํด99
์นดํ ๊ณ ๋ฆฌ: PS
๋ฌธ์
์ค๋ช
์ ๊ทธ๋ฆผ์ฒ๋ผ โRโ ์์ ์ถ๋ฐํด ์ํ์ข์ฐ๋ก ์์ง์ผ ์ ์๋๋ฐ ์ด์ ๊น์ง ํ์ด๋ดค๋ BFS/DFS ๋ฌธ์ ์ ๋ค๋ฅธ์ ์ ํ ์นธ์ฉ ์์ง์ด๋ฉด์ ์ํ์ข์ฐ๋ฅผ ํ์ํด๊ฐ๋ ๋ฐฉ์์ด ์๋๋ผ
- โDโ ๋ฅผ ๋ง๋ ๋ ๊น์ง ์์ง์ด๊ฑฐ๋
- ๊ฒฉ์์ ๋ ๋ถ๋ถ์ ๋ง๋ ๋ ๊น์ง ์์ง์ธ๋ค.
์์์ ๊ฒฝ์ฐ ๋นจ๊ฐ ํ์ดํ ๋๋ก ์ด 7๋ฒ ์์ง์ด๋ฉด โRโ ์์ โGโ ๊น์ง ๊ฐ ์ ์๋ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋๋ค.
ํ์ด
์ด์ ๊น์ง์ ๋ฌธ์ ๋ ์ฃผ๋ก DFS ๋ก ํ์๋๋ฐ ์ด๋ฒ ๋ฌธ์ ๋ BFS ๋ก ํธ๋ ๊ฒ์ด ๋ ์ ์ ํ๋ค. DFS ๋ก ํธ๋ ๊ฒฝ์ฐ ์ต๋จ ๊ฒฝ๋ก์ธ์ง ํ์ธํ๋ ๋ก์ง์ด ์ถ๊ฐ๋ก ํ์ํ๋ค.
ํ์์ ์์ํ โRโ ์ ์์น๋ฅผ ์ฐพ์ ํ BFS ๋ฅผ ์์ํ๋ค. bfs
ํจ์์์๋ โRโ ์์ ์ถ๋ฐํด โGโ ์ ๋๋ฌํ ๋ ๊น์ง์ ์ ์ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ฃผ๋ฉด ๋๋ค.
์ ์ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋ dist ๋ณ์๋ฅผ dfs ํจ์์ ์ธ์๋ก ์ ๋ฌํ๊ฑฐ๋ bfs ์ ๊ฒฝ์ฐ queue ์ ๋ฃ์ด์ฃผ๋ ์์ผ๋ก ๊ตฌํ๋ฉด ๋๋ค.
์ฅ์ ๋ฌผ์ ๋ง๋๊ฑฐ๋ ๋ฒฝ์ ๋๋ฌํ ๋ ๊น์ง ์ญ ์ด๋ํ ํ, ๊ทธ ๋
ธ๋๊ฐ ์์ง ๋ฐฉ๋ฌธ ์ ์ด๋ผ๋ฉด ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ณ ๋ค์ ํ์์ ์ํด queue ์ ์ขํ๋ฅผ ๋ฃ์ด์ค๋ค. ์ด๋, dist + 1
์ ๋๊ฒจ์ค์ ๋
ธ๋ ๊ฐ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํด ์ค๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class Solution {
static String[][] graph;
static boolean[][] visited;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static int n;
public int solution(String[] board) {
n = board.length;
graph = new String[n][];
visited = new boolean[n][];
int x = 0, y = 0;
for (int i = 0; i < n; i++) {
graph[i] = new String[board[i].length()];
visited[i] = new boolean[board[i].length()];
char[] charArray = board[i].toCharArray();
for (int j = 0; j < charArray.length; j++) {
String s = String.valueOf(charArray[j]);
graph[i][j] = s;
if (s.equals("R")) {
x = i;
y = j;
}
}
}
return bfs(x, y);
}
private int bfs(int x, int y) {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[] {x, y, 0});
visited[x][y] = true;
while (!queue.isEmpty()) {
int[] current = queue.poll();
int cx = current[0];
int cy = current[1];
int dist = current[2];
if (graph[cx][cy].equals("G")) {
return dist;
}
for (int i = 0; i < 4; i++) {
int nx = cx;
int ny = cy;
while (isInRange(nx + dx[i], ny + dy[i]) && !graph[nx + dx[i]][ny + dy[i]].equals("D")) {
nx += dx[i];
ny += dy[i];
}
if (!visited[nx][ny]) {
visited[nx][ny] = true;
queue.add(new int[] {nx, ny, dist + 1});
}
}
}
return -1;
}
private boolean isInRange(int x, int y) {
return x >= 0 && x < n && y >= 0 && y < graph[x].length;
}
}
๋๊ธ๋จ๊ธฐ๊ธฐ