https://www.acmicpc.net/problem/21610
"""
"""
N, M = map(int, input().split()) # N:격자판크기, M:구름이 이동 횟수
pan = [ list(map(int, input().split())) for _ in range(N) ]
cloud_dir = [ list(map(int, input().split())) for _ in range(M) ] # 구름 이동 목록
# 비구름 생성
cloud = [ [0] * N for _ in range(N) ]
for i in range(N-2, N):
cloud[i][0] = 1
cloud[i][1] = 1
dx = [0, -1, -1, -1, 0, 1, 1, 1]
dy = [-1, -1, 0, 1, 1, 1, 0, -1]
def move_cloud(d, s):
cloud_make = []
# 1. 모든 구름이 d 방향으로 s칸 이동한다.
for i in range(N):
for j in range(N):
if cloud[i][j] == 1:
mx = i + (dx[d] * s)
my = j + (dy[d] * s)
if not (0 <= mx < N and 0 <= my < N):
mx = mx % N
my = my % N
cloud_make.append((mx, my)) # 비구름을 만들 목록
cloud[i][j] = 0 # 현재 위치의 비구름은 초기화
for x, y in cloud_make:
cloud[x][y] = 1
# 2. 각 구름에서 비가 내려 구름이 있는 칸의 바구니에 저장된 물의 양이 1 증가한다.
for i in range(N):
for j in range(N):
if cloud[i][j] == 1:
pan[i][j] += 1
# 3. 대각선 방향에 물이 있는 바구니 수만큼 물의 양을 증가시켜주기
for i in range(N):
for j in range(N):
if cloud[i][j] == 1:
bucket_cnt = 0
for k in range(1, 8, 2):
mx = i + dx[k]
my = j + dy[k]
if not (0 <= mx < N and 0 <= my < N):
continue
if pan[mx][my] > 0:
bucket_cnt += 1
pan[i][j] += bucket_cnt
""" 4. 구름이 있었던 칸을 제외한 나머지 칸 중에서 물의 양이 2 이상인 칸에 구름이 생긴다. 구름이 생기면 물의 양이 2만큼 줄어든다.
기존에 구름이 있었던 곳의 구름은 사라진다. """
for i in range(N):
for j in range(N):
if cloud[i][j] == 0 and pan[i][j] >= 2: # 구름이 없었고 물의 양이 2 이상이라면, 구름을 생성하고 물의 양을 2 줄인다.
cloud[i][j] = 1
pan[i][j] -= 2
elif cloud[i][j] == 1: # 기존에 구름이 있었던 곳은 구름을 사라지게 한다.
cloud[i][j] = 0
for d, s in cloud_dir:
move_cloud(d-1, s)
print(sum( [ sum(x) for x in pan ] ))
문제 설명대로 단순 구현하면 쉽게 풀 수 있는 문제