BFS를 브루트 포스로 돌려 특정 육지에서 출발, 도착 가능한 가장 긴 육지까지의 거리를 리턴하고 최댓값을 기록했다.
var map = [[String]]()
for _ in 0..<N{
let row = Array(readLine()!.map({String($0)}))
map.append(row)
}
이 부분을 해결하는 과정이 가장 관건이었다. map
을 문자열 이차원 배열로 활용해 접근하려고 했는데(스위프트에서 문자열 조회는 문자열 인덱스로 접근해야 하기 때문에 불편했다) map
으로 문자열로 만들지 않으면 캐릭터와 달랐기 때문에 빌드 실패가 계속 떴다.
import Foundation
let input = readLine()!.split(separator: " ").map({Int(String($0))!})
let (N, M) = (input[0], input[1])
let dx = [1, -1, 0, 0]
let dy = [0, 0, 1, -1]
var answer = 0
var map = [[String]]()
for _ in 0..<N{
let row = Array(readLine()!.map({String($0)}))
map.append(row)
}
for i in 0..<N{
for j in 0..<M{
if map[i][j] == "L"{
answer = max(answer, BFS(row:i, col:j))
}
}
}
print(answer)
func BFS(row:Int, col:Int) -> Int{
var queue = [(Int, Int, Int)]()
queue.append((row, col, 0))
var map = map
map[row][col] = "W"
var index = 0
var total = 0
while queue.count > index{
let curData = queue[index]
let curRow = curData.0
let curCol = curData.1
let curCnt = curData.2
total = max(total, curCnt)
for i in 0..<4{
let nextRow = curRow + dy[i]
let nextCol = curCol + dx[i]
if nextRow < 0 || nextCol < 0 || nextRow >= N || nextCol >= M{
continue
}
if map[nextRow][nextCol] == "L"{
map[nextRow][nextCol] = "W"
queue.append((nextRow, nextCol, curCnt + 1))
}
}
index += 1
}
return total
}