반응형
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net

이번 문제는 단순한 BFS, DFS탐색 문제입니다.
기본 문제이지만, Swift 언어 활용을 위해 풀어보려고 합니다.
최소 거리는 BFS탐색을 이용해서 자주 풀기 때문에 BFS코드로 풀었습니다.
map함수는 갈 수 있는 곳 1과 갈 수 없는 곳 0으로 입력으로 받았고요.
check함수는 방문했는지 여부, distance는 최소거리를 구하기 위해 사용했습니다.
주의 해야할 점은 입력값의 map이 숫자가 붙어서 나오는데,
Swift는 readLine()!.map { Int(String($0)) ! }를 이용하면 붙은 정수를 하나씩 떼서 정수 배열로 만들 수 있습니다.
솔루션 코드는 다음과 같습니다.
//
// main.swift
// swift_test
//
//
import Foundation
let t = readLine()!.split(separator: " ").map {Int($0)!}
let N = t[0]
let M = t[1]
var dx = [1, -1, 0, 0]
var dy = [0, 0, -1, 1]
var map = Array(repeating: Array(repeating: 0, count: M), count: N)
var check = Array(repeating: Array(repeating: false, count: M), count: N)
var distance = Array(repeating: Array(repeating: 0, count: M), count: N)
for i in 0..<N{
var temp: [Int]
temp = readLine()!.map { Int(String($0))! }
map[i] = temp
}
func bfs(){
distance[0][0] = 1
check[0][0] = true
var q = Array<(Int, Int)>()
q.append((0, 0))
while !q.isEmpty{
let poped = q[0]
q.remove(at: 0)
let x = poped.0
let y = poped.1
for k in 0..<4{
let nx = x + dx[k]
let ny = y + dy[k]
if nx >= 0 && nx < N && ny >= 0 && ny < M && !check[nx][ny] && map[nx][ny] == 1{
distance[nx][ny] = distance[x][y] + 1
check[nx][ny] = true
q.append((nx, ny))
}
}
}
}
bfs()
print(distance[N-1][M-1])
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 1707] 이분 그래프 C++ (0) | 2021.01.11 |
---|---|
[백준 11660] 구간 합 구하기 5 C++ (0) | 2021.01.10 |
[백준 11724] 연결 요소의 개수 C++ (0) | 2020.08.28 |
[백준 16929] Two Dots C++ (0) | 2020.08.25 |
[백준 2667] 단지번호붙이기 C++ (0) | 2020.08.24 |