반응형
이번 문제는 단순한 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 |