새소식

인기 검색어

프로그래머스/Lv.2

[Swift] 미로 탈출

  • -
import Foundation

typealias Point = (i: Int, j: Int)

enum Map: String {
    case start = "S"
    case exit = "E"
    case lever = "L"
    case way = "O"
    case wall = "X"
}

var row: Int = 0
var col: Int = 0
var newMaps: [[Map]] = []

func moveMap(_ startPoint: Point, _ targetPoint: Point, _ visited: [[Bool]], _ movedValue: [[Int]]) -> Int {
    var visited = visited
    var movedValue = movedValue
    var queue: [(point: Point, count: Int)] = [(startPoint, 0)]
    
    while !queue.isEmpty {
        let item = queue.removeFirst()
        let point = item.point
        let count = item.count
        if point.i < 0 || row <= point.i || point.j < 0 || col <= point.j || visited[point.i][point.j] || newMaps[point.i][point.j] == .wall { continue }
        movedValue[point.i][point.j] = min(movedValue[point.i][point.j], count)
        if point == targetPoint { continue }
        visited[point.i][point.j] = true
        queue.append(((point.i, point.j + 1), count + 1))
        queue.append(((point.i, point.j - 1), count + 1))
        queue.append(((point.i + 1, point.j), count + 1))
        queue.append(((point.i - 1, point.j), count + 1))
    }
    
    return movedValue[targetPoint.i][targetPoint.j]
}

func solution(_ maps:[String]) -> Int {
    var startPoint: Point = (0,0)
    var leverPoint: Point = (0,0)
    var exitPoint: Point = (0,0)
    
    row = maps.count
    col = maps[0].count
    var visited: [[Bool]] = Array(repeating: Array(repeating: false, count: col), count: row)
    var movedValue: [[Int]] = Array(repeating: Array(repeating: Int.max, count: col), count: row)
    newMaps = maps.enumerated().map { (i, str) in
        str.enumerated().compactMap { (j, char) in
            let map = Map(rawValue: String(char))
            if map == .start { startPoint = (i,j) }
            if map == .lever { leverPoint = (i,j) }
            if map == .exit { exitPoint = (i,j) }
            return map
        }
    }

    let leverValue = moveMap(startPoint, leverPoint, visited, movedValue)
    if leverValue == Int.max { return -1 }
    let exitValue = moveMap(leverPoint, exitPoint, visited, movedValue)
    if exitValue == Int.max { return -1 }
    return leverValue + exitValue
}

 

'프로그래머스 > Lv.2' 카테고리의 다른 글

[Swift] 혼자 놀기의 달인  (0) 2023.06.24
[Swift] 테이블 해시 함수  (0) 2023.06.24
[Swift] 문자열 압축  (0) 2023.06.23
[Swift] 시소 짝궁  (0) 2023.06.23
[Swift] 하노이의 탑  (0) 2023.06.20
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.