👀 문제
https://school.programmers.co.kr/learn/courses/30/lessons/169199
👊 도전
1. 설계
- BFS 구현
2. 구현
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
class Solution {
fun solution(t: String, p: String): Int {
val queue: Queue<Triple<Int, Int, Int>> = LinkedList()
val isVisited = Array(board.size) { BooleanArray(board[0].length) }
run loop@{
board.forEachIndexed { index, s ->
val j = s.indexOf('R')
if (j != -1) {
isVisited[index][j] = true
queue.offer(Triple(index, j, 0))
return@loop
}
}
}
val direction = arrayOf(
intArrayOf(0, 1), intArrayOf(0, -1), intArrayOf(-1, 0), intArrayOf(1, 0)
)
while (queue.isNotEmpty()) {
val item = queue.poll()
for (i in 0 until 4) {
var x = item.first
var y = item.second
val addX = direction[i][0]
val addY = direction[i][1]
while (x + addX in board.indices && y + addY in 0 until board[0].length
&& board[x + addX][y + addY] != 'D'
) {
x += addX
y += addY
}
if (!isVisited[x][y]) {
if (board[x][y] == 'G') {
return item.third + 1
} else {
isVisited[x][y] = true
queue.offer(Triple(x, y, item.third + 1))
}
}
}
}
return -1
}
3. 결과
🤟 성공 🤟
4. 설명
- 최소 움직임을 구하는 것이므로 BFS이다
- BFS 구현을 위해 방문 여부를 나타내는 isVisited, Queue를 선언한다.
- 상하좌우 움직임을 나타내는 direction 좌표 배열을 만들고, 이동할 수 있는 범위를 체크한다(D가 나올 때 까지 움직일 수 있다) .
- 방문하지 않은 곳이라면 Triple(x좌표, y좌표, 현재count)를 저장한다.
- 큐 안에서 ‘G’를 찾은 경우 해당 카운트+1을 리턴하고, 큐를 다 돌았는데도 없다면 방문할 수 없으므로 -1을 리턴한다.