📖 문제 링크
https://www.acmicpc.net/problem/21610
21610번: 마법사 상어와 비바라기
마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기
www.acmicpc.net
✅ 최종 코드
PyPy3로 제출!
좌표를 꼼꼼히 적자.... 삽질 그만...
from collections import deque
n, m = map(int, input().split())
board = [[0] * (n + 1)] + [[0] + list(map(int, input().split())) for _ in range(n)]
# 1, 2, 3, 4, 5, 6, 7, 8
dx = [0, 0, -1, -1, -1, 0, 1, 1, 1]
dy = [0, -1, -1, 0, 1, 1, 1, 0, -1]
cloud = deque([[n, 1], [n,2], [n-1, 1], [n-1, 2]])
#cloud.append()
plus = deque()
def move(d, s):
while cloud:
x, y = cloud.popleft()
nx, ny = x, y
for i in range(s):
nx = nx + dx[d]
ny = ny + dy[d]
if nx <= 0:
nx = n
if nx >= n+1:
nx = 1
if ny <= 0:
ny = n
if ny >= n+1:
ny = 1
board[nx][ny] += 1
#물양 증가한 곳 저장
plus.append([nx,ny])
def watercopy():
while plus:
cnt = 0
x, y = plus.popleft()
visited[x][y] = 1
for i in range(2, len(dx), 2):
#2:왼쪽대각 4:오른쪽대각 6:아래오른대각 8:아래왼쪽대각
nx = x + dx[i]
ny = y + dy[i]
if 0<nx<n+1 and 0<ny<n+1 and board[nx][ny] > 0:
cnt += 1
board[x][y] += cnt
for l in range(m):
d, s = map(int, input().split())
visited = [[0] * (n + 1)] + [[0] * (n+1) for _ in range(n+1)]
move(d, s)
watercopy()
for i in range(1, n+1):
for j in range(1, n+1):
if board[i][j] >= 2:
if visited[i][j] != 1:
cloud.append([i, j])
board[i][j] -= 2
result = 0
for i in range(n+1):
result += sum(board[i])
print(result)
'알고리즘 > Python' 카테고리의 다른 글
[백준/Python] 23288번 : 주사위 굴리기 2 (0) | 2022.04.29 |
---|---|
[백준/Python] 21608번 : 상어 초등학교 (0) | 2022.04.27 |
[백준/Python] 17144번: 미세먼지 안녕! (0) | 2022.04.21 |
[백준/Python] 7562번 : 나이트의 이동 (0) | 2022.04.14 |
[백준/Python] 7576번: 토마토 (JAVA버전 추가) (0) | 2022.04.13 |