새소식

인기 검색어

백준/골드

[Swift] 4179번 : 불!

  • -

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

 

4179번: 불!

입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. 다음 입력으로 R줄동안 각각의 미로 행이 주어진다. 각각의 문자

www.acmicpc.net

import Foundation

var demessions = readLine()!
    .split(separator: " ")
    .compactMap { Int($0) }

let N = demessions.first!
let M = demessions.last!


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

var boards: [[String]] = []

var jihoonQueue: [(Int, Int)] = []
var jihoonBoards: [[Int]] = Array(repeating: Array(repeating: -1, count: M), count: N)

var fireQueue: [(Int, Int)] = []
var fireBoards: [[Int]] = Array(repeating: Array(repeating: -1, count: M), count: N)

for i in 0..<N {
    let input = readLine()!.map { String($0) }
    boards.append(input)
    
    for j in 0..<input.count {
        if input[j] == "F" {
            fireQueue.append((i, j))
            fireBoards[i][j] = 0
        }
        if input[j] == "J" {
            jihoonQueue.append((i, j))
            jihoonBoards[i][j] = 0
        }
    }
}

func fire() {
    var index = 0
    while index < fireQueue.count {
        let (x, y) = fireQueue[index]
        index += 1
        
        for dir in 0..<4 {
            let nx = x + dx[dir]
            let ny = y + dy[dir]
            
            if (0..<N ~= nx) && (0..<M ~= ny) && boards[nx][ny] != "#" && fireBoards[nx][ny] < 0  {
                fireQueue.append((nx, ny))
                fireBoards[nx][ny] = fireBoards[x][y] + 1
            }
        }
    }
}

func jihoon() {
    var index = 0
    while index < jihoonQueue.count {
        let (x, y) = jihoonQueue[index]
        index += 1
        
        for dir in 0..<4 {
            let nx = x + dx[dir]
            let ny = y + dy[dir]
            
            if !(0..<N ~= nx) || !(0..<M ~= ny) {
                print(jihoonBoards[x][y] + 1)
                return
            }
            
            if jihoonBoards[nx][ny] >= 0 || boards[nx][ny] == "#" { continue }
            if fireBoards[nx][ny] != -1 && fireBoards[nx][ny] <= jihoonBoards[x][y] + 1 { continue }
            
            jihoonQueue.append((nx, ny))
            jihoonBoards[nx][ny] = jihoonBoards[x][y] + 1
        }
    }

    print("IMPOSSIBLE")
}

fire()
jihoon()

 

'백준 > 골드' 카테고리의 다른 글

[Swift] 5427번 : 불  (0) 2024.03.18
[Swift] 7569번 : 토마토  (0) 2024.03.18
[Swift] 10026번 : 적록색약  (0) 2024.03.18
[Swift] 7576번 : 토마토  (0) 2024.03.18
[Swift] 2493번 : 탑  (0) 2024.01.12
Contents

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

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