๋ฐฑ์ค€ - ๊ฐ์‹œ(Swift)

2022. 11. 29. 10:46ใ†Algorithm

๋ฐฑ์ค€ - ๊ฐ์‹œ(Swift)

 

 

 ๋ฌธ์ œ ์„ค๋ช…

 

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

 

 ๋‚˜์˜ ํ’€์ด

 

์ฒ ์ €ํ•œ ๊ตฌํ˜„๋ฌธ์ œ์ด๊ณ  ์ด ๋ถ„์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ๋งŽ์ด ์ฐธ๊ณ ํ–ˆ๋‹ค.

 

https://0urtrees.tistory.com/227

 

swift DFS ์™„์ „ํƒ์ƒ‰, ๋ฐฑ์ค€ 15683 ๊ฐ์‹œ ๋ฌธ์ œํ’€์ด

๋ฐฑ์ค€ 15683๋ฒˆ, ๊ฐ์‹œ ๋ฌธ์ œ์„ค๋ช… ์˜ค๋Š˜์€ ๋ฐฑ์ค€ 15683, ๊ฐ์‹œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‹œ ๋ฌธ์ œ๋Š” solved.ac๊ธฐ์ค€, ๊ณจ๋“œ5๋กœ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ธฐ์ค€ ์ค‘ํ›„๋ฐ˜์— ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ œํ•œ์€ 1์ดˆ, ๋ฉ”๋ชจ

0urtrees.tistory.com

 

ํ•˜๋‚˜์˜ ์ขŒํ‘œ์—์„œ ์˜†์œผ๋กœ ํผ์ง€๋Š” ์žฌ๊ท€๋Š” ์จ๋ดค์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๊ฐ๊ฐ์˜ ์ขŒํ‘œ์— ์žˆ๋Š” ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ์žฌ๊ท€๋ฅผ ํ•˜๋Š” ๊ฒƒ์€ ์ฒ˜์Œ์ด์—ˆ๋‹ค. ์šฐ์„  cctv์˜ ์ขŒํ‘œ๋ฅผ cctv๋ฐฐ์—ด์— ๋„ฃ๊ณ  DFS๋ฅผ ๋Œ๋•Œ๋งˆ๋‹ค cctvIdx์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์„ ๋นผ๊ณ  ๋™์ž‘ํ•˜๋ฉด ๋œ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  cctvList์˜ count๊ฐ€ DFS์˜ ๋ ˆ๋ฒจ๊ณผ ๋™์ผํ•ด์งˆ๋•Œ ํ˜„์žฌ์žฌ๊ท€๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด ๋œ๋‹ค.

 

import Foundation

typealias Tuple = (Int, Int, Int)
let dx = [-1, 0, 1, 0]
let dy = [0, 1, 0, -1]


let nm = readLine()!.components(separatedBy:" ").map{Int($0)!}
let N = nm[0], M = nm[1] // x, y์ขŒํ‘œ
var arr = [[Int]]()
var cctvList = [Tuple]() // cctv๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ๋ฐฐ์—ด
var zeroCnt = 0 // ์ฒ˜์Œ 0์˜ ์ˆซ์ž
let posXRange = 0..<N 
let posYRange = 0..<M

for _ in 0..<N {
    arr.append(readLine()!.components(separatedBy:" ").map{Int($0)!})
}

for i in arr.indices {
    for j in arr[i].indices {
        if arr[i][j] >= 1 && arr[i][j] <= 5 { // cctv๋“ค์€ cctv๋ฐฐ์—ด์— ์ถ”๊ฐ€
            cctvList.append((arr[i][j], i, j))
        } else if arr[i][j] == 0 {
            zeroCnt += 1
        }
    }
}

// ํ•œ ์ค„์„ ๋ฐฉํ–ฅ์— ๋งž๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜
func coverZeroOneline(_ pos: (Int, Int), _ dir: (Int), _ tmpArr: inout [[Int]]) -> Int {
    var posX = pos.0 + dx[dir]
    var posY = pos.1 + dy[dir]
    var coverZeroCnt = 0
    while posXRange ~= posX && posYRange ~= posY && tmpArr[posX][posY] != 6 {
        if tmpArr[posX][posY] == 0 {
            tmpArr[posX][posY] = -1
            coverZeroCnt += 1
        }
        posX = posX + dx[dir]
        posY = posY + dy[dir]
    } 
    return coverZeroCnt
}

// cctvํƒ€์ž…์— ๋”ฐ๋ผ ๋ผ์ธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ใ…Ž๋งˆ์ˆ˜
func runCCTV(_ cctvType: Int, _ cctvPos: (Int, Int), _ dir: Int, _ tmpArr: inout [[Int]]) -> Int {
    var coverToCnt = 0
    if cctvType == 1 {
        coverToCnt += coverZeroOneline(cctvPos, dir, &tmpArr)
    } else if cctvType == 2 {
        [0, 2].forEach { dirCnt in 
            coverToCnt += coverZeroOneline(cctvPos, (dir + dirCnt) % 4, &tmpArr)              
        } 
    } else if cctvType == 3 {
        (0...1).forEach { dirCnt in 
            coverToCnt += coverZeroOneline(cctvPos, (dir + dirCnt) % 4, &tmpArr)                
        }
    } else if cctvType == 4 {
        (0...2).forEach { dirCnt in 
            coverToCnt += coverZeroOneline(cctvPos, (dir + dirCnt) % 4, &tmpArr)                
        }
    } else if cctvType == 5 {
        (0...3).forEach { dirCnt in 
            coverToCnt += coverZeroOneline(cctvPos, (dir + dirCnt) % 4, &tmpArr)                
        }
    }
    return coverToCnt
}

var Ans = Int.max
func DFS(_ cctvIdx: Int, _ coverCnt: Int, _ arr: [[Int]]) {
    if cctvIdx >= cctvList.count {
        let temp = zeroCnt - coverCnt
        Ans = Ans > temp ? temp : Ans // ํ˜„์žฌ ์ปค๋ฒ„ํ•œ๊ฒŒ ๋” ๋งŽ๋‹ค๋ฉด temp๊ฐ€ ์ ์–ด์ง€๋ฏ€๋กœ ์ ์€ ๊ฐ’์ด Ans๊ฐ€ ๋œ๋‹ค.
        return
    }
    
    let newCCTV = cctvList[cctvIdx]
    var tmpArr = arr
    for dir in 0..<4 {
        let cctvType = newCCTV.0
        let cctvPos = (newCCTV.1, newCCTV.2)
        
        let newCoverCnt = runCCTV(cctvType, cctvPos, dir, &tmpArr)
        DFS(cctvIdx+1, coverCnt + newCoverCnt, tmpArr)
        tmpArr = arr
    }
    
}

DFS(0, 0, arr)
print(Ans)