๋ฌธ์
https://www.acmicpc.net/problem/17144
๋ฐฑ์ค ๋ฌธ์ ์ง - 0x0D๊ฐ - ์๋ฎฌ๋ ์ด์
์๊ณ ๋ฆฌ์ฆ: ์๋ฎฌ๋ ์ด์
ํ์ด
๊ณต๊ธฐ์ฒญ์ ๊ธฐ๋ ํญ์ 1๋ฒ ์ด์ ์ค์น๋์ด ์๊ณ , ํฌ๊ธฐ๋ ๋ ํ์ ์ฐจ์งํ๋ค. ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๊ฐ ์ค์น๋์ด ์์ง ์์ ์นธ์๋ ๋ฏธ์ธ๋จผ์ง๊ฐ ์๊ณ , (r, c)์ ์๋ ๋ฏธ์ธ๋จผ์ง์ ์์ Ar,c์ด๋ค.
1์ด ๋์ ์๋ ์ ํ ์ผ์ด ์์๋๋ก ์ผ์ด๋๋ค.
1. ๋ฏธ์ธ๋จผ์ง๊ฐ ํ์ฐ๋๋ค. ํ์ฐ์ ๋ฏธ์ธ๋จผ์ง๊ฐ ์๋ ๋ชจ๋ ์นธ์์ ๋์์ ์ผ์ด๋๋ค.
- (r, c)์ ์๋ ๋ฏธ์ธ๋จผ์ง๋ ์ธ์ ํ ๋ค ๋ฐฉํฅ์ผ๋ก ํ์ฐ๋๋ค.
- ์ธ์ ํ ๋ฐฉํฅ์ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๊ฐ ์๊ฑฐ๋, ์นธ์ด ์์ผ๋ฉด ๊ทธ ๋ฐฉํฅ์ผ๋ก๋ ํ์ฐ์ด ์ผ์ด๋์ง ์๋๋ค.
- ํ์ฐ๋๋ ์์ Ar,c/5์ด๊ณ ์์์ ์ ๋ฒ๋ฆฐ๋ค. ์ฆ, ⌊Ar,c/5⌋์ด๋ค.
- (r, c)์ ๋จ์ ๋ฏธ์ธ๋จผ์ง์ ์์ Ar,c - ⌊Ar,c/5⌋×(ํ์ฐ๋ ๋ฐฉํฅ์ ๊ฐ์) ์ด๋ค.
2. ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๊ฐ ์๋ํ๋ค.
- ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์์๋ ๋ฐ๋์ด ๋์จ๋ค.
- ์์ชฝ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ๋ฐ๋์ ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ์ํํ๊ณ , ์๋์ชฝ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ๋ฐ๋์ ์๊ณ๋ฐฉํฅ์ผ๋ก ์ํํ๋ค.
- ๋ฐ๋์ด ๋ถ๋ฉด ๋ฏธ์ธ๋จผ์ง๊ฐ ๋ฐ๋์ ๋ฐฉํฅ๋๋ก ๋ชจ๋ ํ ์นธ์ฉ ์ด๋ํ๋ค.
- ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์์ ๋ถ๋ ๋ฐ๋์ ๋ฏธ์ธ๋จผ์ง๊ฐ ์๋ ๋ฐ๋์ด๊ณ , ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๋ก ๋ค์ด๊ฐ ๋ฏธ์ธ๋จผ์ง๋ ๋ชจ๋ ์ ํ๋๋ค.
๊ณต๊ธฐ์ฒญ์ ๊ธฐ๊ฐ ์ค์น๋ ๊ณณ์ Ar,c๊ฐ -1์ด๊ณ , ๋๋จธ์ง ๊ฐ์ ๋ฏธ์ธ๋จผ์ง์ ์์ด๋ค. -1์ 2๋ฒ ์์๋๋ก ๋ถ์ด์ ธ ์๊ณ , ๊ฐ์ฅ ์ ํ, ์๋ซ ํ๊ณผ ๋ ์นธ์ด์ ๋จ์ด์ ธ ์๋ค.
๋ฐฉ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, T์ด๊ฐ ์ง๋ ํ ๊ตฌ์ฌ๊ณผ์ ๋ฐฉ์ ๋จ์์๋ ๋ฏธ์ธ๋จผ์ง์ ์์ ๊ตฌํด๋ณด์.
์ ์ผ ์ค์ํ ์ ๋ณด๊ฐ ์ค์น๋ฏ์ด ๋ช
์๋์ด์์ผ๋ ์ฃผ์ํด์ผํ๋ค.
๊ณต๊ธฐ์ฒญ์ ๊ธฐ๋ ํญ์ 1์ด์ ์์นํ๋ค.
(์ด๊ฑธ ์์ฝ๊ณ ์ฝ์ง ์ข ํ๋ค...)
์ฌ์ค ์ฒ์์ ํ๋ฅผ ์ฌ์ฉํ์๋๋ฐ ์ด ๋ฌธ์ ์ ์ ์ ํ์ง ์์ ์๋์๋ค.
ํ๋ฒ ํผ์ง ๋ฏธ์ธ๋จผ์ง๋ ์์ด ์ถฉ๋ถํ๋ค๋ฉด ๊ณ์ ํผ์ง ์ ์๊ณ , '๋์์' ํผ์ ธ์ผํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด ์ฒดํฌํ๊ธฐ๊ฐ ๋ฒ๊ฑฐ๋กญ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ํ๊ฐ์ง... ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ์๋ถ๋ถ์ ๋ฐ์๊ณ๋ฐฉํฅ, ์๋ซ๋ถ๋ถ์ ์๊ณ๋ฐฉํฅ์ผ๋ก ์ํํ๋ค.
์ด๊ฑธ ์ด๋ป๊ฒ ๊ตฌํํด์ผํ ์ง ๊ณ ๋ฏผํ๊ณ ๋ง์ ๊ตฌํํด๋์ผ๋ ๋ญ๊ฐ ์๋๊ฒ๊ฐ์์ ํ๋ค์๋ค...
๋๋ ๋ธ๋ ์ค๋ฅผ ์๋ฏ ๋์๋จ๋ถ ์ํ์ ํ๋ฒ์ ์ฒ๋ฆฌํ๋ ค๊ณ ํ๋๋ฐ(์ฌ๋ผ์ด๋ฉ ํผ์ฆ์ฒ๋ผ), ์ปดํจํฐ์๊ฒ๋ ๋์๊ฒ๋ ํ๋ ๋ฐฉ๋ฒ์ด์๋ค.
๋จ์ํ ๋ฐฉ๋ฒ์ด ์ ์ผ ์ข์ ๋ต์ธ ๊ฒฝ์ฐ๊ฐ ๊ฝค ์๋ค.
๋จผ์ ์
๋ ฅ ๋ฐ์ดํฐ๋ค์ ์ ๋ฆฌํด์ผํ๋ค.
๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ์์น๋ ๋ถ๋ณ์ ์ด๋ฏ๋ก ๋ฐ๋ก ์ ์ฅํด๋ฌ์ผ ํ๋๋ฐ, ์ฒซ๋ฒ์งธ๋ก ๋ฐ๊ฒฌ๋ -1์ ์๋ถ๋ถ, ๋๋ฒ์งธ๋ ์๋ซ๋ถ๋ถ์ด๋ค.
์ด์ฐจํผ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๋ ํญ์ 1์ด(์ธ๋ฑ์ค๋ก๋ 0)์ ์์นํ๋ฏ๋ก ํ๋ง ์ ์ฅํด๋๋ฉด ๋๋ค.
for i in range(R):
line = list(map(int, input().split()))
A.append(line)
for j in range(C):
if line[j] == -1: # ํญ์ 1์ด์ ์์นํ๊ธฐ๋๋ฌธ์ ํ๋ง ์ ์ฅ
air_cleaner.append(i)
1. ๋จผ์ง ํ์ฐ
A์ ์นดํผ๋ณธ์ ๋ง๋ ํ ํ๋ ฌ ํ๋ํ๋๋ฅผ ์ฒดํฌํด์ผํ๋ค.
๋จผ์ง ํ์ฐ์ '๋์๋ค๋ฐ์ ์ผ๋ก' ์ผ์ด๋๋๊ฒ์ด๋ฏ๋ก ์๋ณธ A๋ฅผ ์์ ํด๋ฒ๋ฆฌ๋ฉด ํ์ ๋จผ์ง ๊ณ์ฐ์ ์ํฅ์ ์ฃผ๊ฒ๋๋ค.
๋ง์ฝ ํ์ฌ ์นธ์ ๋จผ์ง๊ฐ ์กด์ฌํ๋ค๋ฉด ๋์๋จ๋ถ์ ํด๋นํ๋ ์ขํ๋ฅผ ๊ตฌํ๋ค.
ํด๋น ์ขํ๊ฐ ๋ฒ์ ๋ด๋ผ๋ฉด (ํ์ฌ ์นธ์ ๋ฏธ์ธ๋จผ์ง // 5) ๋งํผ ํผ๋จ๋ฆฌ๊ณ ์นด์ดํธ๋ฅผ ์ถ๊ฐํ๋ค.
๋ชจ๋ ํผ๋จ๋ ธ๋ค๋ฉด ํ์ฌ ์นธ์ ๋ฏธ์ธ๋จผ์ง์์ (ํ์ฌ ์นธ์ ๋ฏธ์ธ๋จผ์ง // 5) * ์นด์ดํธํ์ ๋งํผ ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ A์ ์นดํผ๋ณธ์ A๋ก ์
๋ฐ์ดํธํ๋ค.
2. ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ์ํ
์๋ถ๋ถ์ ๋ฐ์๊ณ๋ฐฉํฅ, ์๋ซ๋ถ๋ถ์ ์๊ณ๋ฐฉํฅ์ผ๋ก ์ํํ๋ค.
๋๊ณ ๋์ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ํก์
(?)๋๋ฉด ์ฌ๋ผ์ง๋ค.
๊ณต๊ธฐ์ฒญ์ ๊ธฐ์์ ๋ฐ๋์ด ๋์ค๋ ๋ถ๋ถ์ 0, ํก์
๋๋ ๋ถ๋ถ์ 3์ด๋ผ ํ๋ค๋ฉด 3 - 2 - 1 - 0 ์์ผ๋ก ์
๋ฐ์ดํธ ํด์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฆผ์ฒ๋ผ 0 - 1 - 2 - 3 ์์ผ๋ก ํด๊ฒฐํด๋ ๋์ง๋ง ๋ฐ๋ก temp๊ฐ์ ๋ง๋ค์ด๋ฌ์ผ ํ๋ฏ๋ก ๋ฒ๊ฑฐ๋กญ๋ค.
3 - 2 - 1 - 0 ์์ผ๋ก ์งํ์ ํก์
๋ถ๋ถ์ ์์นํ ์นธ์ ์์ ๋ฒ๋ฆฌ๊ณ ์์ํ ์ ์์ผ๋ฏ๋ก ํจ์ฌ ์์กฐ๋กญ๋ค.
๋ฐ๋ผ์ ์๋ถ๋ถ์ ์ํ ์์๋ 1) ์์ชฝ → ์๋์ชฝ(ํก์
), 2) ์ค๋ฅธ์ชฝ → ์ผ์ชฝ, 3) ์๋์ชฝ → ์์ชฝ, 4) ์ผ์ชฝ(์ฒญ์ ๊ธฐ) → ์ค๋ฅธ์ชฝ ์ด ๋๋ค.
๋ํ 4๋ฒ ์งํ์ ์ฒญ์ ๊ธฐ์ ๋ฐ๋ก ์ ์นธ์ 0์ผ๋ก ์
๋ฐ์ดํธํด์ค์ผํ๋ค.
์์ ์ฌ์กฑ์์ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ์ํ์ ์ฌ๋ผ์ด๋ฉ ํผ์ฆ๊ณผ ๊ฐ์ด ์๊ฐํ๋ค๊ณ ํ๋๋ฐ, ํผ์ฆ์ ๊ตฌ์กฐ๋ฅผ ์๊ฐํด๋ณด๋ฉด ์ด ์์๊ฐ ์ณ๋ค. ์ฐ์ ๋นผ๊ณ ๋ฐ์ด๋ด๋๊ฒ์ด๋ค.
์ ์ฒด ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 31120KB / ์๊ฐ: 1884ms
from sys import stdin
input = stdin.readline
R, C, T = map(int, input().split())
A = []
air_cleaner = []
directions = [(0, 1), (-1, 0), (0, -1), (1, 0)]
for i in range(R):
line = list(map(int, input().split()))
A.append(line)
for j in range(C):
if line[j] == -1: # ํญ์ 1์ด์ ์์นํ๊ธฐ๋๋ฌธ์ ํ๋ง ์ ์ฅ
air_cleaner.append(i)
def spread_dust():
A_copy = [line[:] for line in A]
for i in range(R):
for j in range(C):
if A[i][j] > 0:
new_dust = A[i][j] // 5
cnt = 0
for dx, dy in directions:
nx, ny = i + dx, j + dy
if 0 <= nx < R and 0 <= ny < C and A[nx][ny] != -1:
A_copy[nx][ny] += new_dust
cnt += 1
A_copy[i][j] -= new_dust * cnt
return A_copy
# โญ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์์ ํผ์ ธ๋๊ฐ๋ ์ชฝ์ด ๋นจ์๋ค์ด๋ ์ชฝ๋ถํฐ ์
๋ฐ์ดํธํ๋ค.
# ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ์๋ถ๋ถ
def cleaning_top():
top = air_cleaner[0]
# ์ -> ์๋๋ก ๋นจ์๋ค์ด๊ธฐ
for i in range(top-1, 0, -1):
A[i][0] = A[i-1][0]
# ์ค๋ฅธ์ชฝ -> ์ผ์ชฝ์ผ๋ก
for i in range(C-1):
A[0][i] = A[0][i+1]
# ์๋ -> ์
for i in range(top):
A[i][C-1] = A[i+1][C-1]
# ์ผ์ชฝ -> ์ค๋ฅธ์ชฝ
for i in range(C-1, 1, -1):
A[top][i] = A[top][i-1]
A[top][1] = 0
# ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ์๋ซ๋ถ๋ถ
def cleaning_bottom():
bottom = air_cleaner[1]
# ์๋ -> ์
for i in range(bottom+1, R-1):
A[i][0] = A[i+1][0]
# ์ค๋ฅธ์ชฝ -> ์ผ์ชฝ
for i in range(C-1):
A[R-1][i] = A[R-1][i+1]
# ์ -> ์๋
for i in range(R-1, bottom, -1):
A[i][C-1] = A[i-1][C-1]
# ์ผ์ชฝ -> ์ค๋ฅธ์ชฝ
for i in range(C-1, 1, -1):
A[bottom][i] = A[bottom][i-1]
A[bottom][1] = 0
for _ in range(T):
A = spread_dust()
cleaning_top()
cleaning_bottom()
ret = 0
for row in A:
for col in row:
if col > 0:
ret += col
print(ret)
์ํ ๊ตฌ๊ฐ ๋ฒ์๋ง ์ ์ค์ ํ๋ฉด ์ฌ์ด ๋ฌธ์ ๋ค!