→ Problems

[Algorithm] 백준 - 2178번 미로 탐색 (Swift)

Swift librarian 2024. 5. 13. 10:38

문제 소개

https://www.acmicpc.net/problem/2178

미로를 탐색하는 문제이다. 이러한 문제는 가장 최소의 칸수를 구해야 하는 문제이다.
 

문제 풀이

BFS 풀이

미로이기 때문에 한가지 길로 깊게 탐색하는 것보다 넓게 탐색하는 방법을 생각해 보았다.

import Foundation

let nm = readLine()!.split(separator: " ").map { Int($0)! }
let (n, m) = (nm[0], nm[1])

var map = [[Int]]()
var graph = Array(repeating: Array(repeating: 0, count: m), count: n)
var visited = Array(repeating: Array(repeating: false, count: m), count: n)

graph[0][0] = 1
visited[0][0] = true

for _ in 0..<n {
    let line = Array(readLine()!).map { Int(String($0))! }
    map.append(line)
}

func bfs() {
    var queue = [(0, 0)]
    let directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
    
    while queue.count != 0 {
        let poped = queue.removeFirst()
        
        for direction in directions {
            let i = poped.0 + direction.0
            let j = poped.1 + direction.1
            
            if i >= 0 && i < n && j >= 0 && j < m {
                if map[i][j] == 1 && !visited[i][j] {
                    visited[i][j] = true
                    graph[i][j] = graph[poped.0][poped.1] + 1
                    queue.append((i, j))
                }
            }
        }
    }
}

bfs()

print(graph[n-1][m-1])

 

DFS 풀이 (시간초과)

이것은 시간초과가 나왔는데, 많은 테스트케이스를 통과하는 것으로 봐서는... DFS의 문제인 것 같다.

import Foundation

let nm = readLine()!.split(separator: " ").map { Int($0)! }
let (n, m) = (nm[0], nm[1])

var map = [[Int]]()
var visited = Array(repeating: Array(repeating: false, count: m), count: n)

for _ in 0..<n {
    let line = Array(readLine()!).map { Int(String($0))! }
    map.append(line)
}

var answer = 1000000

func dfs(_ i: Int, _ j: Int, _ depth: Int) {
    if depth > answer { return }
    
    if i == n-1 && j == m-1 {
        answer = min(depth, answer)
    }
    
    let directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
    
    for direction in directions {
        let i = i + direction.0
        let j = j + direction.1
        
        if i >= 0 && i < n && j >= 0 && j < m && !visited[i][j] && map[i][j] == 1 {
            visited[i][j] = true
            dfs(i, j, depth + 1)
            visited[i][j] = false
        }
    }
}

dfs(0, 0, 1)

print(answer)