๋ฐฑ์ค€ - ์ธ๊ตฌ์ด๋™(Swift)

2022. 11. 21. 10:44ใ†Algorithm

๋ฐฑ์ค€ - ์ธ๊ตฌ์ด๋™(Swift)

 

 

 ๋ฌธ์ œ ์„ค๋ช…

 

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

 

16234๋ฒˆ: ์ธ๊ตฌ ์ด๋™

N×Nํฌ๊ธฐ์˜ ๋•…์ด ์žˆ๊ณ , ๋•…์€ 1×1๊ฐœ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ๋•…์—๋Š” ๋‚˜๋ผ๊ฐ€ ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋ฉฐ, rํ–‰ c์—ด์— ์žˆ๋Š” ๋‚˜๋ผ์—๋Š” A[r][c]๋ช…์ด ์‚ด๊ณ  ์žˆ๋‹ค. ์ธ์ ‘ํ•œ ๋‚˜๋ผ ์‚ฌ์ด์—๋Š” ๊ตญ๊ฒฝ์„ ์ด ์กด์žฌํ•œ๋‹ค. ๋ชจ

www.acmicpc.net

 

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

 

์ด ๋ฌธ์ œ๋Š” DFS, BFS๋ฌธ์ œ๋‹ค. ๋ฒฝ์ด ํ—ˆ๋ฌผ ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ณ„์† ํ—ˆ๋ฌธ๋’ค ๋ฒฝ๋“ค์˜ ํ•ฉ์„ ๊ฐœ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋ฐฐ์ •ํ•˜๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด ๋œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ "ํ—ˆ๋ฌผ ์ˆ˜ ์žˆ๋Š” ๋ฒฝ์ด ์žˆ์„๋•Œ"๊นŒ์ง€ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ tempMap์ด ๊ธฐ์กด์˜ map๊ณผ ๋™์ผํ•˜๋‹ค๋ฉด ํƒˆ์ถœํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค. 

์ฒ˜์Œ์—๋Š” BFS์ธ์ง€ ๋ฐ”๋กœํ™•์ธํ•˜์ง€ ๋ชปํ•˜๊ณ  ํ—ค๋งค๋‹ค๊ฐ€ ๋‹ค๋ฅธ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ๊ฐ์„ ์ž ์•˜๋‹ค. ๋ฒฝ์ด ํ—ˆ๋ฌผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ์—ฐํ•ฉ์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ณด๊ณ  ๋ฐ”๋กœ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์–ด์•ผํ•˜๋Š”๋ฐ ์•„์ง ๋งŽ์ด ๋ถ€์กฑํ•˜๋‹ค.

 

import Foundation

struct Point {
    let r: Int
    let c: Int
    
    init(_ r: Int, _ c: Int) {
        self.r = r
        self.c = c
    }
    
    var nexts: [Point] {
        return [
            Point(r+1, c),
            Point(r, c+1),
            Point(r-1, c),
            Point(r, c-1)
        ]
    } 
}

let nlr = readLine()!.components(separatedBy:" ").map{Int($0)!}
var map: [[Int]] = []
var tempMap: [[Int]] = []
var visited = [[Bool]]()
// N<=X<= R ๋ฒ”์œ„
let range = nlr[1]...nlr[2]
// ์ธ๊ตฌ์ด๋™์ด ๋ฉฐ์น ๊ฐ„ ๋ฐœ์ƒํ–ˆ๋Š”์ง€
var cnt = 0
for _ in 0..<nlr[0] {
    map.append(readLine()!.components(separatedBy:" ").map{Int($0)!})
}

while true {
    tempMap = map
    visited = [[Bool]](repeating: [Bool](repeating: false, count: nlr[0]), count: nlr[0])
    for i in 0..<nlr[0] {
        for j in 0..<nlr[0] {
            guard !visited[i][j] else { continue }
            BFS(Point(i, j))
        }
    }
    if tempMap == map {
        break
    } else {
        cnt += 1
        map = tempMap
    }
}
print(cnt)

func BFS(_ p: Point) {
    var queue = [Point]()
    // ๋ฒฝ์ด ํ—ˆ๋ฌผ์–ด์ง€๋Š” ๊ณณ์˜ ํ•ฉ
    var sum = map[p.r][p.c]
    var member = [Point]()
    var partyCount = 1
    queue.append(p)
    visited[p.r][p.c] = true
    
    while !queue.isEmpty {
        let curr = queue.removeFirst()
        member.append(curr)
        for next in curr.nexts where 0..<nlr[0] ~= next.r && 0..<nlr[0] ~= next.c {
            guard !visited[next.r][next.c] else { continue }
            if range ~= abs(map[curr.r][curr.c] - map[next.r][next.c]) {
                visited[next.r][next.c] = true
                sum += map[next.r][next.c]
                queue.append(Point(next.r, next.c))
                partyCount += 1
            }
        }
    }
    
    for x in member {
        tempMap[x.r][x.c] = sum / partyCount
    }
}

 

 

 ํ”ผ๋“œ๋ฐฑ

 

๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด guard๋ฌธ์„ ์“ฐ๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ฆฌ๊ณ  closedRange๋ฅผ ์ด์šฉํ•ด์„œ ํŒจํ„ด๋งค์นญ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ์ ๊ณผ Point์˜ ๊ณ„์‚ฐ์†์„ฑ nexts๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋„ค๊ฐ€์ง€ ๋ฐฉ๋ฉด์„ ๋‹ค๋ฃฌ ์ ์„ ๋ฐฐ์› ๋‹ค.