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

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net

구현문제다.

 

풀이

문제에 주어지는 대로 먼지를 흩뿌리는 함수 spread()와 공기청정기를 가동하는 cleanClock(), cleanAntiClock() 함수를 구현하여 접근했다. spread() 함수의 경우 한 좌표의 인접좌표에 대해서 동작을 구형했고, 배열을 모두 탐색하면서 값이 0 이상이라면 함수를 수행하는 방법으로 구현했다.

공기청정기의 경우 시계/반시계 방향으로 순회하면서 값을 옮겨주는 동작을 구현하였다. 마지막으로 배열을 탐색하여 먼지의 수치를 출력하면 된다.

 

정답 코드

import Foundation
let RCT = readLine()!.split(separator: " ").map{Int($0)!}
let R = RCT[0]
let C = RCT[1]
let T = RCT[2]
var now = Array(repeating: Array(repeating: 0, count: C), count: R)
var next = now
var ap = [(Int,Int)]()
var total = 0
for i in 0..<R{
let line = readLine()!.split(separator: " ").map{Int($0)!}
for k in 0..<C{
now[i][k] = line[k]
if line[k] == -1{
ap.append((i,k))
}
}
}
func spread(x:Int, y:Int){
let dx = [-1,1,0,0]
let dy = [0,0,-1,1]
let dust = now[x][y]/5
for i in 0..<4{
let nx = x+dx[i]
let ny = y+dy[i]
if nx < 0 || nx >= R || ny < 0 || ny >= C || now[nx][ny] == -1{ continue }
next[nx][ny] += dust
now[x][y] -= dust
}
next[x][y] += now[x][y]
}
func cleanAntiClock(){
let x = ap[0].0
let y = ap[0].1
for nx in stride(from: x-1, through: 1, by: -1){
now[nx][y] = now[nx-1][y]
}
for ny in stride(from: 0, through: C-2, by: +1){
now[0][ny] = now[0][ny+1]
}
for nx in stride(from: 0, through: x-1, by: +1){
now[nx][C-1] = now[nx+1][C-1]
}
for ny in stride(from: C-1, through: 2, by: -1){
now[x][ny] = now[x][ny-1]
}
now[x][y+1] = 0
}
func cleanClock(){
let x = ap[1].0
let y = ap[1].1
for nx in stride(from: x+1, through: R-2, by: +1){
now[nx][y] = now[nx+1][y]
}
for ny in stride(from: 0, through: C-2, by: +1){
now[R-1][ny] = now[R-1][ny+1]
}
for nx in stride(from: R-1, through: x+1, by: -1){
now[nx][C-1] = now[nx-1][C-1]
}
for ny in stride(from: C-1, through: 2, by: -1){
now[x][ny] = now[x][ny-1]
}
now[x][y+1] = 0
}
for _ in 0..<T{
next = Array(repeating: Array(repeating: 0, count: C), count: R)
for i in 0..<R{
for k in 0..<C{
if now[i][k]>0{
spread(x: i, y: k)
}
}
}
next[ap[0].0][ap[0].1] = -1
next[ap[1].0][ap[1].1] = -1
now = next
cleanAntiClock()
cleanClock()
}
total = now.flatMap({$0}).filter({$0>0}).reduce(0, +)
print(total)
view raw 17144.swift hosted with ❤ by GitHub

'Problem Solving > BOJ' 카테고리의 다른 글

[11779] 최소비용 구하기 2  (0) 2023.02.10
[11444] 피보나치 수 6  (0) 2023.02.08
[4836] 춤  (0) 2023.02.06
[4485] 녹색 옷 입은 애가 젤다지?  (0) 2023.02.05
[3048] 개미  (0) 2023.02.04

+ Recent posts