[백준 2589] 보물섬

Junyoung Park·2022년 4월 23일
0

코딩테스트

목록 보기
394/631
post-thumbnail

1. 문제 설명

보물섬

2. 문제 분석

BFS를 브루트 포스로 돌려 특정 육지에서 출발, 도착 가능한 가장 긴 육지까지의 거리를 리턴하고 최댓값을 기록했다.

var map = [[String]]()
for _ in 0..<N{
    let row = Array(readLine()!.map({String($0)}))
    map.append(row)
}

이 부분을 해결하는 과정이 가장 관건이었다. map을 문자열 이차원 배열로 활용해 접근하려고 했는데(스위프트에서 문자열 조회는 문자열 인덱스로 접근해야 하기 때문에 불편했다) map으로 문자열로 만들지 않으면 캐릭터와 달랐기 때문에 빌드 실패가 계속 떴다.

3. 나의 풀이

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
}
profile
JUST DO IT

0개의 댓글