문제 풀이/탐색ㆍ그래프

[백준] 2178 (미로 탐색)

interfacer_han 2025. 4. 4. 15:50

#1 알고리즘

 

그래프 - 너비 우선 탐색 (BFS, Breadth-First Search)

#1 그래프의 탐색 너비 우선 탐색 - 위키백과, 우리 모두의 백과사전위키백과, 우리 모두의 백과사전.ko.wikipedia.org그래프의 각 정점을 한번씩 방문할 필요가 있다고 해보자. 그 방문의 방

kenel.tistory.com

bfs 알고리즘으로 풀었다.

 

#2 코드 - 코틀린

import java.util.*

var Y = -1
var X = -1
lateinit var miro: Array<Array<Int>>

const val WALL = 0

fun main() {
    // (1) make miro and make discovered for bfs
    val yAndX = readln().split(" ")
    Y = yAndX[0].toInt()
    X = yAndX[1].toInt()
    miro = Array(Y) { Array(X) { -1 } }
    for (y: Int in 0..<Y) {
        val row = readln().toCharArray()
        for (x: Int in 0..<X) {
            miro[y][x] = row[x].toString().toInt()
        }
    }

    // (2) bfs
    bfs(0, 0)

    // (3) print
    println(miro[Y - 1][X - 1])
}

fun bfs(startY: Int, startX: Int) {
    val queue: Queue<Pair<Int, Int>> = LinkedList()
    val visited = Array(Y) { Array(X) { false } }

    queue.add(Pair(startY, startX))
    visited[startY][startX] = true
    miro[startY][startX] = 1

    while (queue.isNotEmpty()) {
        val prev = queue.poll()
        val prevY = prev.first
        val prevX = prev.second

        for (next in getNexts(prevY, prevX)) {
            val nextY = next.first
            val nextX = next.second
            if (!visited[nextY][nextX]) {
                queue.add(Pair(nextY, nextX))
                visited[nextY][nextX] = true
                miro[nextY][nextX] = miro[prevY][prevX] + 1
            }
        }
    }
}

fun getNexts(y: Int, x: Int): List<Pair<Int, Int>> {
    val candidates = listOf(
        Pair(y - 1, x),
        Pair(y + 1, x),
        Pair(y, x - 1),
        Pair(y, x + 1)
    )

    val nexts = ArrayList<Pair<Int, Int>>()
    for (candidate in candidates) {
        val candidateY = candidate.first
        val candidateX = candidate.second
        if ((candidateY in 0..<Y) && (candidateX in 0..<X) && (miro[candidateY][candidateX] != WALL)) {
            nexts.add(candidate)
        }
    }
    return nexts
}

'문제 풀이 > 탐색ㆍ그래프' 카테고리의 다른 글

[백준] 7569 (토마토)  (0) 2025.04.04
[백준] 1697 (숨바꼭질)  (0) 2025.04.03
[백준] 7576 (토마토)  (0) 2025.03.21
[백준] 10026 (적록색약)  (1) 2024.11.27
[백준] 14940 (쉬운 최단거리)  (1) 2024.11.13