https://www.acmicpc.net/problem/17144
17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사
www.acmicpc.net
구현문제다.
풀이
문제에 주어지는 대로 먼지를 흩뿌리는 함수 spread()와 공기청정기를 가동하는 cleanClock(), cleanAntiClock() 함수를 구현하여 접근했다. spread() 함수의 경우 한 좌표의 인접좌표에 대해서 동작을 구형했고, 배열을 모두 탐색하면서 값이 0 이상이라면 함수를 수행하는 방법으로 구현했다.
공기청정기의 경우 시계/반시계 방향으로 순회하면서 값을 옮겨주는 동작을 구현하였다. 마지막으로 배열을 탐색하여 먼지의 수치를 출력하면 된다.
정답 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |

'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 |