소요시간 : 2시간 10분
체감 난이도 : 하
유형 : 구현
if m > 1 조건으로 이동을 하였더니 m=1일 때 오류가 났다.
if m = 0 으로 수정해서 맞았다.
문제를 차근히 이해해서 풀었지만 다음 문장에서 잘못 이해해서 시간이 걸렸다.
이때 구름이 생기는 칸은 3에서 구름이 사라진 칸이 아니어야 한다.
이전 이동에서 사라진 칸도 포함하는 줄 알았으나 해당 이동에서 사라진 칸만을 의미했다.
프린트문으로 노가다 디버깅해서 수정했다.
N ,M = map(int,input().split())
board = [list(map(int, input().split())) for _ in range(N)]
move_lst = [list(map(int, input().split())) for _ in range(M)]
dr = (0, -1, -1, -1, 0, 1, 1, 1)
dc = (-1, -1, 0, 1, 1, 1, 0, -1)
def move(d, s):
global board, cloud_lst
move_to = []
for cloud in cloud_lst:
# 1. 이동
nr, nc = (cloud[0] + dr[d]*s) % N, (cloud[1] + dc[d]*s) % N
# print(cloud, " -> ", (nr, nc))
# 2. 이동 후 칸에 물 + 1
board[nr][nc] += 1
move_to.append((nr, nc))
# 4. 2에서 증가한 칸 주변 물 있는 칸 수만큼 더해줌
cnt_lst = []
for nr, nc in move_to:
cnt = 0
# print("(nr, nc)", (nr, nc))
# print("인접 칸")
for d in [1, 3, 5, 7]:
# print((nr+dr[d], nc + dc[d]))
if 0<=nr + dr[d]<N and 0<=nc + dc[d]<N:
if board[nr + dr[d]][nc + dc[d]] > 0:
cnt += 1
cnt_lst.append((nr, nc, cnt))
# print("인접 카운트", cnt_lst)
# 사라진 구름들
for nr, nc, cnt in cnt_lst:
board[nr][nc] += cnt
return move_to
def gen_cloud(dis_cloud):
global board, cloud_lst
# old_cloud.extend(cloud_lst)
# 3. 구름 사라짐
cloud_lst = []
# print(dis_cloud)
# 5. 구름 생성, 물의 양 2 줄이기
for r in range(N):
for c in range(N):
if (r, c) not in dis_cloud:
if board[r][c] >= 2:
cloud_lst.append((r, c))
board[r][c] -= 2
if M > 0:
cloud_lst = [(N-1, 0), (N-1, 1), (N-2, 0), (N-2, 1)]
dis_cloud = []
for d, s in move_lst:
dis_cloud = move(d-1, s) # 1,2,4번
# print("이동 끝난 후", board)
gen_cloud(dis_cloud)
# print("구름 생성 후", board)
# print("이동한 구름 칸", cloud_lst)
# print("-"*50)
print(sum(sum(board, [])))
# print(cloud_lst)