문제
https://www.acmicpc.net/problem/17144
17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사
www.acmicpc.net
내 풀이
문제에서 말하는 순서대로 구현하였다.
미세먼지를 먼저 확산시키고 -> 공기청정기를 작동시켰다.
풀 때 가장 중요한 것은, 중간중간 코드가 맞는지 결과를 프린트해보는 것이다.
공기청정기를 구현할 때에는 좀 더 머리를 써볼까 생각도 했지만, 짧은 시간 안에 빨리 푸는 연습을 하느라 그냥 생각나는 대로 풀었다.
공기청정기가 닿는 미세먼지들의 좌표를 배열에 다 담고, 그 배열에서 한 칸씩 옮기는 작업을 하였다.
좀 단순한 풀이라는 단점이 있지만, 머리가 안 돌아갈 때 금방 쓸 수 있다는 장점이 있다.
import copy
R, C, T = map(int, input().strip().split())
A, air = [], []
for i in range(R):
A.append(list(map(int, input().strip().split())))
for j in range(C):
if A[i][j] == -1:
air.append((i, j))
dx, dy = [-1, 1, 0, 0], [0, 0, 1, -1]
for _ in range(T):
later_A = [[0]*C for _ in range(R)]
# 미세먼지 확산
for i in range(R):
for j in range(C):
if 0 < A[i][j]:
cnt = 0
x, y = i, j
for k in range(4):
nx, ny = x+dx[k], y+dy[k]
if 0<=nx<R and 0<=ny<C and A[nx][ny] != -1:
later_A[nx][ny] += A[i][j]//5
cnt += 1
A[i][j] -= (A[i][j]//5)*cnt
for i in range(R):
for j in range(C):
if 0 < A[i][j]:
later_A[i][j] += A[i][j]
if A[i][j] == -1:
later_A[i][j] = -1
# 공기청정기 작동
for k in range(2):
if k == 0:
arr = []
x, y = air[k]
for j in range(1, C): arr.append((x, j))
for i in range(x-1, -1, -1): arr.append((i, C-1))
for j in range(C-2, -1, -1): arr.append((0, j))
for i in range(1, x): arr.append((i, 0))
for i in range(len(arr)-1, 0, -1):
lx, ly = arr[i]
px, py = arr[i-1]
later_A[lx][ly] = later_A[px][py]
later_A[px][py] = 0
elif k == 1:
arr = []
x, y = air[k]
for j in range(1, C): arr.append((x, j))
for i in range(x+1, R): arr.append((i, C-1))
for j in range(C-2, -1, -1): arr.append((R-1, j))
for i in range(R-2, x, -1): arr.append((i, 0))
for i in range(len(arr)-1, 0, -1):
lx, ly = arr[i]
px, py = arr[i-1]
later_A[lx][ly] = later_A[px][py]
later_A[px][py] = 0
A = copy.deepcopy(later_A)
ans = 0
for i in range(R):
for j in range(C):
if 0 < A[i][j]:
ans += A[i][j]
print(ans)
다른 풀이
다른 풀이에서 공기청정기를 돌릴 때 while문과 dx, dy 배열을 사용하였다.
내 풀이가 많이 무식한 줄 알았더니, 원리는 똑같은 것 같다.
시뮬레이션이라 이렇게 풀 수 밖에 없는 것 같기도 하다.
총평
미세먼지는 하드코딩이 지배한다!
'알고리즘 > 삼성 기출' 카테고리의 다른 글
마법사 상어와 파이어볼 [백준 20056번] (0) | 2022.10.07 |
---|---|
이차원 배열과 연산 [백준 17140번] (1) | 2022.10.06 |
드래곤 커브 [백준 15685번] (0) | 2022.10.06 |
감시 [백준 15683번] (0) | 2022.10.05 |
인구 이동 [백준 16234번] (0) | 2022.10.01 |