백준 20056 마법사 상어와 파이어볼

wook2·2021년 8월 8일
0

알고리즘

목록 보기
50/117
post-custom-banner

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

구현하는 문제였다.
처음에 문제의 조건인 행이 연결되어 있는것과, 열이 연결되어 있는것을 캐치하지 못해서 시간이 좀 걸렸다.

문제는 크게 파이어볼을 이동시키는것, 두개 이상 있는것을 처리하는것으로 나눌 수 있다.
board안에를 리스트로 만들어놓아 같은 칸에 여러개의 파이어볼을 받을 수 있게 하였다.

from collections import deque
n,m,k = list(map(int,input().split()))
fireballs = []
for i in range(m):
    fireballs.append(list(map(int,input().split())))

dx = [-1,-1,0,1,1,1,0,-1] ## 각각 방향 01234567
dy = [0,1,1,1,0,-1,-1,-1]
temp = []

for i in range(k):
    # print(fireballs)
    board = [[deque([]) for i in range(n)] for i in range(n)]
    for firball in fireballs: ## 파이어볼 이동
        r,c,m,s,d = firball ## 좌표,질량,이동칸수,방향
        r-=1; c-=1
        nx = r + dx[d] * s
        ny = c + dy[d] * s
        nx = (nx + n) % n
        ny = (ny + n) % n
        board[nx][ny].append((m,s,d))

    for x in range(n):
        for y in range(n):
            if board[x][y] != []:
                if len(board[x][y]) == 1:
                    m,s,d = board[x][y][0]
                    temp.append((x,y,m,s,d))
                elif len(board[x][y]) >= 2:
                    m,s,d = 0,0,0
                    for i in range(len(board[x][y])):
                        m += board[x][y][i][0]
                        s += board[x][y][i][1]
                        if board[x][y][i][2] % 2 == 0:
                            d -= 1
                        else:
                            d += 1
                    m //= 5
                    s //= len(board[x][y])
                    if abs(d) == len(board[x][y]): ## 모두 홀수거나 짝수
                        d = 0
                    else:
                        d = 1
                    board[x][y] = []
                    if m > 0:
                        for i in range(4):
                            temp.append((x,y,m,s,d+i*2))
                            board[x][y].append((m,s,d+i*2))
    fireballs = temp
    temp = []

ans = 0
for x in range(n):
    for y in range(n):
        if board[x][y] != []:
            for i in range(len(board[x][y])):
                ans += board[x][y][i][0]

print(ans)
profile
꾸준히 공부하자
post-custom-banner

0개의 댓글