๋ฌธ์
https://www.acmicpc.net/problem/20057
๋ฐฑ์ค ๋ฌธ์ ์ง - 0x0D๊ฐ - ์๋ฎฌ๋ ์ด์
์๊ณ ๋ฆฌ์ฆ: ์๋ฎฌ๋ ์ด์
ํ์ด
๋ง๋ฒ์ฌ ์์ด๊ฐ ํ ๋ค์ด๋๋ฅผ ๋ฐฐ์ ๊ณ , ์ค๋์ ํ ๋ค์ด๋๋ฅผ ํฌ๊ธฐ๊ฐ N×N์ธ ๊ฒฉ์๋ก ๋๋์ด์ง ๋ชจ๋๋ฐญ์์ ์ฐ์ตํ๋ ค๊ณ ํ๋ค. ์์น (r, c)๋ ๊ฒฉ์์ rํ c์ด์ ์๋ฏธํ๊ณ , A[r][c]๋ (r, c)์ ์๋ ๋ชจ๋์ ์์ ์๋ฏธํ๋ค.
ํ ๋ค์ด๋๋ฅผ ์์ ํ๋ฉด ๊ฒฉ์์ ๊ฐ์ด๋ฐ ์นธ๋ถํฐ ํ ๋ค์ด๋์ ์ด๋์ด ์์๋๋ค. ํ ๋ค์ด๋๋ ํ ๋ฒ์ ํ ์นธ ์ด๋ํ๋ค.
ํ ๋ค์ด๋๊ฐ ํ ์นธ ์ด๋ํ ๋๋ง๋ค ๋ชจ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ ํ ๋น์จ๋ก ํฉ๋ ๋ฆฌ๊ฒ ๋๋ค.
ํ ๋ค์ด๋๊ฐ x์์ y๋ก ์ด๋ํ๋ฉด, y์ ๋ชจ๋ ๋ชจ๋๊ฐ ๋น์จ๊ณผ α๊ฐ ์ ํ์๋ ์นธ์ผ๋ก ์ด๋ํ๋ค. ๋น์จ์ด ์ ํ์๋ ์นธ์ผ๋ก ์ด๋ํ๋ ๋ชจ๋์ ์์ y์ ์๋ ๋ชจ๋์ ํด๋น ๋น์จ๋งํผ์ด๊ณ , ๊ณ์ฐ์์ ์์์ ์๋๋ ๋ฒ๋ฆฐ๋ค. α๋ก ์ด๋ํ๋ ๋ชจ๋์ ์์ ๋น์จ์ด ์ ํ์๋ ์นธ์ผ๋ก ์ด๋ํ์ง ์์ ๋จ์ ๋ชจ๋์ ์๊ณผ ๊ฐ๋ค. ๋ชจ๋๊ฐ ์ด๋ฏธ ์๋ ์นธ์ผ๋ก ๋ชจ๋๊ฐ ์ด๋ํ๋ฉด, ๋ชจ๋์ ์์ ๋ํด์ง๋ค. ์์ ๊ทธ๋ฆผ์ ํ ๋ค์ด๋๊ฐ ์ผ์ชฝ์ผ๋ก ์ด๋ํ ๋์ด๊ณ , ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ๋ ์์ ๊ทธ๋ฆผ์ ํด๋น ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ฉด ๋๋ค.
ํ ๋ค์ด๋๋ (1, 1)๊น์ง ์ด๋ํ ๋ค ์๋ฉธํ๋ค. ๋ชจ๋๊ฐ ๊ฒฉ์์ ๋ฐ์ผ๋ก ์ด๋ํ ์๋ ์๋ค. ํ ๋ค์ด๋๊ฐ ์๋ฉธ๋์์ ๋, ๊ฒฉ์์ ๋ฐ์ผ๋ก ๋๊ฐ ๋ชจ๋์ ์์ ๊ตฌํด๋ณด์.
์ ๋ฌธ์ ์์ ๋งํ๋ ๋น์จ์ ์๋์ ๊ฐ๋ค.

์ฌ์ค ์ฒ์์๋ ํ ๋ค์ด๋๊ฐ x์ ์์๋, ๋ชจ๋๊ฐ y๋ก ์ฎ๊ฒจ์ง๊ณ ์ผ์ ํ ๋น์จ๋ก ํผ๋จ๋ฆฐ ๋ค ๋จ์ ๋ชจ๋๋ α๋ก ๋๊ฒจ์ฃผ๋๊ฑธ๋ก ์ดํดํ๊ณ ... ๋๋ถ์ ์ฝ์ง ์ข ํ๋ค. ์ ์ด๋ ๊ฒ ์ดํดํ๋์ง ์์ง๋ ๋ชจ๋ฅด๊ฒ ์;;
์ ์ฒด์ ์ธ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ ๋ค์ด๋๊ฐ x → y ๋ก ์ด๋.
- ๋น์จ์ ๋ง๊ฒ ํผ๋จ๋ฆผ. ๋ง์ฝ ๊ฒฉ์๋ฅผ ๋ฒ์ด๋๋ค๋ฉด ๊ฒฉ์ ๋ฐ์ผ๋ก ๋ฒ์ด๋ ๋ชจ๋์ ์์ ๋ํด์ค.
- ๋จ์ ๋ชจ๋๋ฅผ α๋ก ์ฎ๊น.
์ด๋ฏธ ๋ชจ๋๊ฐ ์๋ ์ํฉ์ด๋ผ๋ฉด ๊ทธ ๋ชจ๋์ ํฉ์น๋ค. ๊ณ์ฐ์ ์๋กญ๊ฒ ์ด๋๋๋ ๋ชจ๋ ๊ธฐ์ค์ด๋ค.
์ด ๋ฌธ์ ์์ ์ค์ํ ๋ถ๋ถ์ ํ ๋ค์ด๋๊ฐ ์ผ์ ํ ๊ท์น์ผ๋ก ํ์ ํ๋ค๋๊ฒ์ด๋ค.
ํ์ ํ๋ฉด์ ํด๋น ๋ฐฉํฅ์ ๊ธฐ์ค์ผ๋ก ๋น์จ ํ๋ ํ์ ํ๋ค.
์ฐ์ ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ ์์ชฝ์ ํฅํ ๋์ ๋น์จ๊ฐ์ด๋ค.
directions = [(0, -1), (1, 0), (0, 1), (-1, 0)]
patterns = {0: [(-2, 0, 0.02), (2, 0, 0.02), (-1, 0, 0.07), (1, 0, 0.07),
(-1, -1, 0.1), (1, -1, 0.1), (-1, 1, 0.01), (1, 1, 0.01), (0, -2, 0.05)]}
ํ ๋ค์ด๋๋ ํญ์ ์ → ๋จ → ๋ → ๋ถ ์์ผ๋ก ํ์ ํ๋ฏ๋ก ๋ฐฉํฅ๊ฐ์ 0๋ถํฐ ์ฐจ๋ก๋๋ก ์ง์ ํด๋๋ค.
ํ์ ์ ๋ฐ๋ฅธ ๋น์จ๊ฐ์ ๋์ ๋๋ฆฌ๋ก ๋ฐ๋ก ์ ์ฅํด๋๋ค.
y๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ๊ณ ๊ฐ๊ฐ์ ์ขํ, ๋น์จ๊ฐ์ ๊ธฐ๋กํ๋ค. (α๋ ๋ฐ๋ก ๊ณ์ฐํ ๊ฑฐ๋ผ์ ๋นผ๋์.)
์ด์ patterns[0]์ ๊ฐ์ง๊ณ ๋จ๋๋ถ์ผ๋๋ฅผ ๊ณ์ฐํด์ฃผ๋ฉด ๋๋ค.
ํ๋ ฌ์ ์๊ณ๋ฐฉํฅ์ผ๋ก 90º ํ์ ์ํค๋๊ฑด ํด๋ดค๋๋ฐ, ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
๋ฐฉํฅ์ด ์์ชฝ์ผ๋์ ๋จ์ชฝ์ผ๋๋ฅผ ๋น๊ตํด๊ฐ๋ฉฐ ๋๋ค๊ฒจ๋ณด๋ (-y, x)๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋์๋ค.
def rotate(pattern):
"""(x, y) => (-y, x) ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก 90º ํ์ """
rotated = [(-y, x, per) for x, y, per in pattern]
return rotated
๊ทธ๋ผ ์์ชฝ์ ๋๊ณ ๋๋ ธ์๋ ๋จ์ชฝ์ด, ๋จ์ชฝ์ ๋๊ณ ๋๋ ธ์๋ ๋์ชฝ์ด, ๋์ชฝ์ ๋๊ณ ๋๋ ธ์๋ ๋ถ์ชฝ์ด ๋์ค๊ฒ ๋ค.
# directions ์์์ ๋๊ฐ์ด
patterns[1] = rotate(patterns[0])
patterns[2] = rotate(patterns[1])
patterns[3] = rotate(patterns[2])
์ด์ ๋น์จ๊ณผ ๊ด๋ จ๋ ๊ณ์ฐ์ ๋ค ํด๋์ผ๋ ๋ฉ์ธ ๋ก์ง์ ์์ฑํ๋ฉด ๋๋ค.
ํ ๋ค์ด๋์ ์ฒ์ ์ขํ๋ ๊ฒฉ์์ ์ ๊ฐ์ด๋ฐ์ด๋ค. x, y ๋ชจ๋ N // 2 ์ธ ์ํ์์ ์์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์๋ ์นธ์ ์๋ 1๋ถํฐ ์์ํ๋ค.

๊ทธ๋ฆผ์ ์ ๋ณด๋ฉด ์, ๋จ / ๋, ๋ถ ๋ฐฉํฅ์ผ๋ ์ด๋ํ๋ ์นธ์ด ๊ฐ๋ค.
1, 1 → 2, 2 → 3, 3... ์์ผ๋ก ์งํ๋๋ค.
๋ฐ๋ผ์ while๋ฌธ์ผ๋ก x, y๊ฐ (0, 0)์ด ์๋๋๊น์ง ์๋ ๊ณผ์ ์ ์งํํ๋ค.
- ํ์ฌ ์ด๋๊ธธ์ด๋งํผ ๋ ๋ฒ์ฉ ๋ฐ๋ณต.
- ํ๋ฒ์ ๋ฐ๋ณต๋ง๋ค ํ ๋ค์ด๋๋ฅผ ์ด๋์ํค๊ณ ๋ชจ๋ ์ด๋ ์ฒ๋ฆฌ.
- ํ์ฌ ์ขํ๋ฅผ ์๋ก์ด ์ขํ๋ก ์ ๋ฐ์ดํธ.
- ํ๋ฒ์ ๋ฐ๋ณต์ด ๋๋ฌ๋ค๋ฉด ๋ฐฉํฅ ์ ํ ํ ๋๋ฒ์งธ ๋ฐ๋ณต ์์.
- ๋๋ฒ์งธ ๋ฐ๋ณต๋ ๋๋ฌ๋ค๋ฉด ์ด๋๊ธธ์ด๊ฐ์ 1 ์ถ๊ฐ.
๋ชจ๋ ์ด๋ ์ฒ๋ฆฌ๋ ํจ์๋ก ๋ฐ๋ก ๋ถ๋ฆฌํด๋์๋ค.
ํ์ฌ ์นธ์ ๋ชจ๋๊ฐ์ ๋ณ์๋ก ๋ง๋ค์ด ์ ์ฅํด๋๊ณ , patterns[๋ฐฉํฅ๊ฐ]์ ์ ์ฅ๋์ด์๋ ์ขํ, ๋น์จ๊ฐ ์ ํ๋์ฉ ์ํํ๋ค.
ํ์ฌ ์ขํ์ patterns์ ์ขํ๋ก ์๋ก์ด ์ขํ๋ฅผ ์์ฑ ํ ๋ชจ๋์ ๋น์จ์ ๊ณ์ฐํ๋ค.
๋ง์ฝ ์๋ก์ด ์ขํ๊ฐ ๊ฒฉ์ ๋ฒ์ ๋ด์ ์กด์ฌํ๋ค๋ฉด ์๋ก์ด ์ขํ์ ๊ณ์ฐํ ๋ชจ๋๋ฅผ ๋ํด์ค๋ค. ๋ฒ์ด๋๋ค๋ฉด, ๋ฒ์ด๋ ๋ชจ๋ ๊ฐ์ ๋ํด์ค๋ค.
๋ฒ์์ ์๊ด์์ด ๋ฟ๋ฆฌ๋ ๋ชจ๋์ ์์ ๋ฐ๋ก ๊ธฐ๋กํด๋ฌ์ผํ๋ค.
๋ชจ๋ ๋ฟ๋ ค์ค ๋ค ๋จ์ ๋ชจ๋์ ๊ฐ์ α๋ก ์ฎ๊ฒจ์ค๋ค.
α๊ฐ ๋ฒ์ ๋ด์ ์์นํ ์ขํ๋ผ๋ฉด ํด๋น ์ขํ์ ๋ชจ๋์ ๋จ์ ๋ชจ๋๋ฅผ ๋ํด์ฃผ๊ณ , ๋ฒ์ด๋๋ค๋ฉด ๋ฒ์ด๋ ๋ชจ๋ ๊ฐ์ ๋ํด์ค๋ค.
๋ง์ง๋ง์ผ๋ก ํ์ฌ ์ขํ์ ๋ชจ๋์์ ๋ฟ๋ ค์ค ๋ชจ๋๋งํผ์ ๋นผ์ค๋ค.
์ ์ฒด ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 41308KB / ์๊ฐ: 880ms
from sys import stdin
input = stdin.readline
N = int(input())
graph = [list(map(int, input().split())) for _ in range(N)]
# ๋ฐฉํฅ๊ฐ. ์, ๋จ, ๋, ๋ถ
directions = [(0, -1), (1, 0), (0, 1), (-1, 0)]
# y์นธ ์ฃผ๋ณ์ผ๋ก ํฉ์ด์ง๋ ๋ชจ๋์ (x, y, ๋น์จ)
patterns = {0: [(-2, 0, 0.02), (2, 0, 0.02), (-1, 0, 0.07), (1, 0, 0.07),
(-1, -1, 0.1), (1, -1, 0.1), (-1, 1, 0.01), (1, 1, 0.01), (0, -2, 0.05)]}
def rotate(pattern):
"""(x, y) => (-y, x) ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก 90º ํ์ """
rotated = [(-y, x, per) for x, y, per in pattern]
return rotated
# directions ์์์ ๋๊ฐ์ด
patterns[1] = rotate(patterns[0])
patterns[2] = rotate(patterns[1])
patterns[3] = rotate(patterns[2])
x = y = N//2
length = 1
# outside: ๊ฒฉ์ ๋ฐ์ผ๋ก ๋ฟ๋ ค์ง ๋ชจ๋, dir: ํ์ฌ ๋ฐฉํฅ๊ฐ
outside = dir = 0
is_finished = False
def spread(x, y, dir):
global outside
# ํ์ฌ ์นธ์ ๋ชจ๋
sand = graph[x][y]
# ํ์ฌ ์นธ์ผ๋ก๋ถํฐ ๋ฟ๋ ค์ง ๋ชจ๋์ ์
spreaded = 0
for dx, dy, per in patterns[dir]:
new_sand = int(sand * per)
nx, ny = x + dx, y + dy
# ๋ฒ์ ๋ด๋ผ๋ฉด ํด๋น ์ขํ์ ๋ํด์ฃผ๊ณ , ๋ฒ์ด๋๋ค๋ฉด outside์ ๋ํด์ค๋ค.
# ๋ฟ๋ ค์ง ๋ชจ๋์ ์์ ๋ฒ์์ ์๊ด์์ด ๊ธฐ๋ก
if 0 <= nx < N and 0 <= ny < N:
graph[nx][ny] += new_sand
else:
outside += new_sand
spreaded += new_sand
# ํ์ฌ ๋ชจ๋์ ์์์ ๋ฟ๋ ค์ง ๋ชจ๋์ ์์ ๋บ ๋ค์ ์ด ๊ฐ์ ์กฐ๊ฑด์ ๋ง๊ฒ ๋ํด์ค.
ax, ay = x + directions[dir][0], y + directions[dir][1]
if 0 <= ax < N and 0 <= ay < N:
graph[ax][ay] += sand - spreaded
else:
outside += sand - spreaded
graph[x][y] -= spreaded
while not is_finished:
# ๋๋ฒ์ฉ(์ข/ํ, ์ฐ/์) length๋งํผ ๋ฐ๋ณต
for _ in range(2):
for _ in range(length):
# x → y ํ ๋ค์ด๋ ์ด๋
nx, ny = x + directions[dir][0], y + directions[dir][1]
spread(nx, ny, dir)
x, y = nx, ny
# (0, 0)์ ๋์ฐฉํ๋ฉด ํ๋๊ทธ๋ฅผ True๋ก ๋ณ๊ฒฝ ํ break
if x == 0 and y == 0:
is_finished = True
break
if is_finished:
break
# length๋งํผ ์ด๋ ํ ๋ฐฉํฅ์ 90º ํ์ด์ค
dir = (dir + 1) % 4
# ๋๋ฒ์ ๋ฐ๋ณต์ด ๋๋๋ฉด length์ 1 ๋ํด์ค
length += 1
print(outside)
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํด์ ์ขํ ์ํ๋ฅผ ์ฒดํฌํ๋ ๋ฐฉ์์ผ๋ก ํ์๋๋ฐ ๋ณด๊ธฐ์ ๋ณ๋ก๋ค...
๊ทธ๋ ๋ค๊ณ exit()์ ์ฌ์ฉํ๊ธฐ์ ์ข ๊ทธ๋ ๋ค. ๋ ๊น๋ํ ๋ฐฉ๋ฒ์ด ์๋์ง ์ฐพ์๋ณด์.