chldkato

백준 21610 마법사 상어와 비바라기 (파이썬) 본문

백준

백준 21610 마법사 상어와 비바라기 (파이썬)

chldkato 2021. 5. 18. 12:09

https://www.acmicpc.net/problem/21610

 

21610번: 마법사 상어와 비바라기

마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기

www.acmicpc.net

1. 방향 순서에 맞춰서 dx, dy를 만든다.

   구름 좌표를 저장할 q를 만들고 맨 처음 구름의 좌표를 넣어준다.

2. 현재 q에 있는 구름들만 이동하기 위해서 len(q)를 구하고 하나씩 빼주면서 구름을 이동시킨다.

   다음칸이 범위를 벗어나면 문제의 조건대로 연결되도록 만들어준다.

   다음칸의 좌표를 q에 넣어준다.

3. 비가 중복해서 내리지 않도록 c로 체크한다.

   c 값이 0이면 물의 양을 증가시키고 c를 1로 체크한다.

4. q를 다시 만들어 구름을 없앤다.

5. 모든 좌표를 탐색하면서 해당 좌표에서 c값이 1이면 물이 내린 칸이다.

   대각선 방향에 물이 있는 칸을 센 후 물의 양을 증가시킨다.

6. 물의 양이 2 이상이고 구름이 없었던 칸에서만, 물의 양을 2 줄이고 q에 좌표를 넣어 구름을 만든다.

7. 물의 양 총합을 출력한다.

from collections import deque
import sys

input = sys.stdin.readline
dx = [0, -1, -1, -1, 0, 1, 1, 1]
dy = [-1, -1, 0, 1, 1, 1, 0, -1]

n, m = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]
q = deque([[n-1, 0], [n-1, 1], [n-2, 0], [n-2, 1]])

for u in range(m):
    c = [[0] * n for _ in range(n)]
    d, s = map(int, input().split())
    d -= 1

    qlen = len(q)
    while qlen:
        x, y = q.popleft()
        nx = x + s * dx[d]
        ny = y + s * dy[d]

        if nx >= n:
            nx %= n
        elif nx < 0:
            nx = (n - 1) - (((-1) * nx - 1) % n)
        if ny >= n:
            ny %= n
        elif ny < 0:
            ny = (n - 1) - (((-1) * ny - 1) % n)

        q.append([nx, ny])
        qlen -= 1

    for k in q:
        x, y = k
        if c[x][y] == 0:
            a[x][y] += 1
            c[x][y] = 1

    q = deque([])

    for x in range(n):
        for y in range(n):
            if c[x][y] == 1:
                cnt = 0
                for i in range(1, 8, 2):
                    nx = x + dx[i]
                    ny = y + dy[i]
                    if 0 <= nx < n and 0 <= ny < n:
                        if a[nx][ny] > 0:
                            cnt += 1
                a[x][y] += cnt

    for x in range(n):
        for y in range(n):
            if a[x][y] >= 2:
                if c[x][y] == 0:
                    q.append([x, y])
                    a[x][y] -= 2

print(sum(sum(b) for b in a))

Comments