[백준 2206] 벽 부수고 이동하기

Junyoung Park·2022년 7월 2일
0

코딩테스트

목록 보기
473/631
post-thumbnail

1. 문제 설명

벽 부수고 이동하기

2. 문제 분석

방문 체크용 배열을 3차원으로 만들어서 확인했다. 아직 미방문(값이 0인지 여부로 체크)했고 다음 노드가 0일 때 이동 가능 / 다음 노드가 1이고 아직 벽을 부순 적이 없을 때 이동 가능

3. 나의 풀이

import Foundation

let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (input[0], input[1])
var nodes = [[Int]]()
let dx = [1, -1, 0, 0]
let dy = [0, 0, 1, -1]

for _ in 0..<N {
    let line = Array(readLine()!.map{Int(String($0))!})
    nodes.append(line)
}

func BFS() -> Int {
    var queue = [(Int, Int, Int)]()
    queue.append((0, 0, 0))
    var visited = Array(repeating: Array(repeating: [0, 0], count: M), count: N)
    visited[0][0][0] = 1
    var index = 0
    
    while queue.count > index {
        let curData = queue[index]
        let curRow = curData.0
        let curCol = curData.1
        let curWall = curData.2
        
        if curRow == (N-1) && curCol == (M-1) {
            return visited[curRow][curCol][curWall]
        }
        
        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 visited[nextRow][nextCol][curWall] == 0 && nodes[nextRow][nextCol] == 0 {
                visited[nextRow][nextCol][curWall] = visited[curRow][curCol][curWall] + 1
                queue.append((nextRow, nextCol, curWall))
            }
            
            if nodes[nextRow][nextCol] == 1 && curWall == 0 {
                visited[nextRow][nextCol][1] = visited[curRow][curCol][0] + 1
                queue.append((nextRow, nextCol, 1))
            }
            
        }
        index += 1
    }
    
    return -1
}

let answer = BFS()
print(answer)
profile
JUST DO IT

0개의 댓글