티스토리 뷰

PS

[Swift] 백준_불(5427)

희철 2023. 1. 14. 23:07

문제

 

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

 

5427번: 불

상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에

www.acmicpc.net

 

 

풀이

 

불! 문제와 아예 똑같은 것 같다.

https://heecheol.tistory.com/143

 

[Swift] 백준_불!(4179)

문제 https://www.acmicpc.net/problem/4179 4179번: 불! 입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. 다음 입력으로 R줄동

heecheol.tistory.com

import Foundation

let caseCount = Int(readLine()!)!
let dx = [1,0,-1,0]
let dy = [0,1,0,-1]
for _ in 0..<caseCount {
    let input = readLine()!.split(separator: " ").map { Int(String($0))! }
    var building: [[String.Element]] = []
    var fire = Array(repeating: Array(repeating: -1, count: input[0]), count: input[1])
    var person = Array(repeating: Array(repeating: -1, count: input[0]), count: input[1])
    var fireQueue: [[Int]] = []
    var personQueue: [[Int]] = []
    var minTime = 0
    var check = false
    var idx = 0
    for _ in 0..<input[1] {
        building.append(readLine()!.map { $0 })
    }
    //시작점 넣기
    for i in 0..<input[1] {
        for j in 0..<input[0] {
            if building[i][j] == "*" {
                fireQueue.append([i,j])
                fire[i][j] = 0
            } else if building[i][j] == "@" {
                personQueue.append([i,j])
                person[i][j] = 0
            }
        }
    }
    //불
    while idx < fireQueue.count {
        let current = fireQueue[idx]
        idx += 1
        for k in 0..<dx.count {
            let newX = current[0] + dx[k]
            let newY = current[1] + dy[k]
            if newX < 0 || newY < 0 || newX >= input[1] || newY >= input[0] {
                continue
            }
            if fire[newX][newY] != -1 || building[newX][newY] == "#" {
                continue
            }
            fireQueue.append([newX,newY])
            fire[newX][newY] = fire[current[0]][current[1]] + 1
        }
    }
    idx = 0
    //사람
    outer: while idx < personQueue.count {
        let current = personQueue[idx]
        idx += 1
        for k in 0..<dx.count {
            let newX = current[0] + dx[k]
            let newY = current[1] + dy[k]
            if newX < 0 || newY < 0 || newX >= input[1] || newY >= input[0] {
                minTime = person[current[0]][current[1]] + 1
                check = true
                break outer
            }
            if person[newX][newY] >= 0 || building[newX][newY] == "#" {
                continue
            }
            if fire[newX][newY] != -1 && fire[newX][newY] <= person[current[0]][current[1]] + 1 {
                continue
            }
            personQueue.append([newX,newY])
            person[newX][newY] = person[current[0]][current[1]] + 1
        }
    }
    if check {
        print(minTime)
    } else {
        print("IMPOSSIBLE")
    }
}

 

댓글
최근에 올라온 글
Total
Today
Yesterday