[Kotlin/프로그래머스] 코딩테스트 연습 > 연습문제 > 리코쳇 로봇

👀 문제

https://school.programmers.co.kr/learn/courses/30/lessons/169199

👊 도전

1. 설계

  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. 설명

  1. 최소 움직임을 구하는 것이므로 BFS이다
    • BFS 구현을 위해 방문 여부를 나타내는 isVisited, Queue를 선언한다.
    • 상하좌우 움직임을 나타내는 direction 좌표 배열을 만들고, 이동할 수 있는 범위를 체크한다(D가 나올 때 까지 움직일 수 있다) .
    • 방문하지 않은 곳이라면 Triple(x좌표, y좌표, 현재count)를 저장한다.
    • 큐 안에서 ‘G’를 찾은 경우 해당 카운트+1을 리턴하고, 큐를 다 돌았는데도 없다면 방문할 수 없으므로 -1을 리턴한다.

👏 해결 완료!