티스토리 뷰

PS

[Swift] 백준_상범 빌딩(6593)

희철 2023. 1. 15. 23:39

문제

 

https://www.acmicpc.net/problem/6593

 

6593번: 상범 빌딩

당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어

www.acmicpc.net

 

 

풀이

 

어렵지 않게 BFS로 풀었지만 갑자기 입력받는게 헷갈려서 시간이 좀 걸렸다...

 

2차원배열에서는 dx, dy로 상하좌우를 생각했지만 이번 문제는 층까지 있으므로 3차원으로 생각해야한다. 2차원배열일때의 풀이에서 dz만 추가하면 된다.

 

반복문을 통해 building에서 "S"를 찾고 위치를 큐에 넣어준다. 출발점이 하나이므로 "S"를 찾았다면 break를 통해 반복문을 탈출해준다.

 

이후에는 2차원 bfs문제와 동일하다.

newX, newY, newZ값을 current에 각각 dx, dy, dz[i]값을 더해주어 구해준다.

이때, 세 값이 모두 빌딩의 크기보다 작아야하고 "#"이면 안된다. 또한, 출발점을 제외하고 전부 -1로 초기화해준 result에서의 값도 -1이 아니라면 이미 방문했다는 의미이므로 -1인 경우에만 큐에 추가해주어야한다.

 

만약 모든 조건을 만족하게 되면 큐에 추가될 것이고, building[newZ][newX][newY]의 값은 current값에 1을 더한 값이 된다.

 

이 과정을 반복하다가 building[newZ][newX][newY]가 "E"라면 결과값을 출력하고 "0 0 0"이 나올때까지 반복해주면된다.

 

"E"를 만나지 못했다면 continue loop 코드를 만날 수 없으므로 while문이 종료될 것이다. 이때는 탈출에 실패했으므로 "Trapped!"를 출력해주면 된다.

import Foundation

let dx = [1,0,-1,0,0,0]
let dy = [0,1,0,-1,0,0]
let dz = [0,0,0,0,1,-1]

loop: while true {
    let input = readLine()!
    if input == "0 0 0" {
        break
    }
    
    let testCase = input.split(separator: " ").map { Int(String($0))! }
    var building: [[[String]]] = []
    var result = Array(repeating:Array(repeating: Array(repeating: -1, count: testCase[2]), count: testCase[1]), count: testCase[0])
    var queue: [[Int]] = []

    for _ in 0..<testCase[0] {
        var temp: [[String]] = []
        while true {
            let input = readLine()!.map { String($0) }
            if input.isEmpty {
                break
            }
            temp.append(input)
        }
        building.append(temp)
    }
    
    outer: for i in 0..<testCase[0] {
        for j in 0..<testCase[1] {
            for k in 0..<testCase[2] {
                if building[i][j][k] == "S" {
                    queue.append([i,j,k]) //z,x,y
                    result[i][j][k] = 0
                    break outer
                }
            }
        }
    }
    while !queue.isEmpty {
        let current = queue.removeFirst()
        for i in 0..<dx.count {
            let newZ = current[0] + dz[i]
            let newX = current[1] + dx[i]
            let newY = current[2] + dy[i]
            if newX < 0 || newY < 0 || newZ < 0 || newZ >= testCase[0] || newX >= testCase[1] || newY >= testCase[2] {
                continue
            }
            if building[newZ][newX][newY] == "#" || result[newZ][newX][newY] != -1 {
                continue
            }
            queue.append([newZ,newX,newY])
            result[newZ][newX][newY] = result[current[0]][current[1]][current[2]] + 1
            if building[newZ][newX][newY] == "E" {
                print("Escaped in \(result[newZ][newX][newY]) minute(s).")
                continue loop
            }
        }
    }
    print("Trapped!")
}

 

 

_____________________________________________________________________________________________________

 

화이팅

'PS' 카테고리의 다른 글

[Swift] 백준_N과 M(2)(15650)  (0) 2023.01.17
[Swift] 백준_N과 M(1)(15649)  (0) 2023.01.16
[Swift] 백준_안전 영역(2468)  (1) 2023.01.15
[Swift] 백준_스타트링크(5014)  (0) 2023.01.15
[Swift] 백준_단지번호붙이기(2667)  (0) 2023.01.15
댓글
최근에 올라온 글
Total
Today
Yesterday