๋ฐฑ์ค€ - ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•!(Swift)

2022. 11. 23. 14:06ใ†Algorithm

๋ฐฑ์ค€ - ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•!(Swift)

 

 

 ๋ฌธ์ œ ์„ค๋ช…

 

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

 

17144๋ฒˆ: ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•!

๋ฏธ์„ธ๋จผ์ง€๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์‚ฌ๊ณผ๋Š” ๊ณต๊ธฐ์ฒญ์ •๊ธฐ๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์˜ ์„ฑ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์‚ฌ๊ณผ๋Š” ์ง‘์„ ํฌ๊ธฐ๊ฐ€ R×C์ธ ๊ฒฉ์žํŒ์œผ๋กœ ๋‚˜ํƒ€๋ƒˆ๊ณ , 1×1 ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆด๋‹ค. ๊ตฌ์‚ฌ

www.acmicpc.net

 

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

 

ํฌ๊ฒŒ ์–ด๋ ต์ง€์•Š์€ ๋ฌธ์ œ์˜€์ง€๋งŒ ์‹œ๊ณ„๋ฐฉํ–ฅ ํ˜น์€ ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๋•Œ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋Š” 0์œผ๋กœ ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์„ ๋†“์น˜๊ณ  ์กฐ๊ธˆ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. 

์ด์ œ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๋ฌธ์ œ๋Š” ์กฐ๊ธˆ ์ต์ˆ™ํ•ด์ง„ ๊ฒƒ ๊ฐ™๋‹ค.

 

import Foundation

let input = readLine()!.components(separatedBy:" ").map{Int($0)!}
let R = input[0], C = input[1], T = input[2]
var map = [[Int]]()
var tempArr = [[Int]]()
let rowRange = 0...R-1
let colRange = 0...C-1
var cleaners: [Int] = []
for _ in 0..<R {
    map.append(readLine()!.components(separatedBy:" ").map{Int($0)!})
}

for i in 0..<R {
    if map[i][0] == -1 { cleaners.append(i) }
}
let upCleaner = cleaners[0]
let downCleaner = cleaners[1]


for _ in 0..<T {
    tempArr = map
    spread()
    map = tempArr
    clean()
}
var sum = 0
for i in 0..<R {
    for j in 0..<C {
        if map[i][j] != -1 {
            sum += map[i][j]
        }
    }
}

print(sum)

// ํ™•์‚ฐ์‹œํ‚ค๋Š” ํ•จ์ˆ˜
func spread() {
    for i in 0..<R {
        for j in 0..<C {
            if map[i][j] != 0, map[i][j] != -1 {
                var cnt = 0
                let spreadAmount = map[i][j] / 5
                for next in [(i+1, j), (i-1, j), (i, j-1), (i, j+1)] where rowRange ~= next.0 && colRange ~= next.1 {
                    guard map[next.0][next.1] != -1 else { continue }
                    tempArr[next.0][next.1] += spreadAmount
                    cnt += 1
                }
                tempArr[i][j] -= spreadAmount * cnt
            }
        }
    }
}

func clean() {
    
    // ๊ณต๊ธฐ์ฒญ์ •๊ธฐ์˜ ์œ„์ชฝ์ผ๋•Œ
    
    for i in stride(from: upCleaner-1, through: 0 ,by: -1) {
        if map[i+1][0] != -1 {
            map[i+1][0] = map[i][0]
        }
    }
    
    for i in 1..<C {
        map[0][i-1] = map[0][i]
    }
    
    for i in 1..<upCleaner+1 {
        map[i-1][C-1] = map[i][C-1]
    }
    
    for i in stride(from: C-2, through: 1, by: -1) {
        map[upCleaner][i+1] = map[upCleaner][i]
        if i == 1 {
            map[upCleaner][i] = 0
        }
    }
    
    // ๊ณต๊ธฐ์ฒญ์ •๊ธฐ ์•„๋ž˜์ชฝ์ผ๋•Œ
    
    for i in downCleaner+1..<R {
        if map[i-1][0] != -1 {
            map[i-1][0] = map[i][0]
        } 
    }
    
    for i in 1..<C {
        map[R-1][i-1] = map[R-1][i]
    }
    
    for i in stride(from: R-2, through: downCleaner, by: -1) {
        map[i+1][C-1] = map[i][C-1]
    }
    
    for i in stride(from: C-2, through: 1, by: -1) {
        map[downCleaner][i+1] = map[downCleaner][i]
        if i == 1 {
            map[downCleaner][i] = 0
        }
    }
}