알고리즘/Python

[백준/Python] 21610번: 마법사 상어와 비바라기

_SIHA_ 2022. 4. 28. 17:25

📖  문제 링크

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)