백준 20056번 마법사 상어와 파이어볼 (Python 3)

2022. 10. 18. 15:13Problem solving

 

Baekjoon online judge 20056번 파이썬

 

링크

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

 

20056번: 마법사 상어와 파이어볼

첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치

www.acmicpc.net

소요시간 1시간

 

소스코드

import sys
from collections import defaultdict
input=sys.stdin.readline

index=[[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]]

def move():
    global map_data
    global kv_fireball
    global last_index
    promise_merge=set()
    for key in kv_fireball.keys():
        r,c,m,s,d=kv_fireball[key]
        iy,ix=index[d]
        ny=(iy*s+r)%n
        nx=(ix*s+c)%n
        kv_fireball[key]=[ny,nx,m,s,d]
        map_data[r][c].remove(key)
        map_data[ny][nx].append(key)
    for key in kv_fireball.keys():
        r,c,m,s,d=kv_fireball[key]
        if len(map_data[r][c])>=2:
            promise_merge.add((r,c))

    for mr,mc in promise_merge:
        mass_cnt=0
        speed_cnt=0
        cnt=0
        check_d=set()
        for i in map_data[mr][mc]:
            r,c,m,s,d=kv_fireball[i]
            mass_cnt+=m
            speed_cnt+=s
            cnt+=1
            check_d.add(d%2)
            del kv_fireball[i]
        map_data[mr][mc]=list()
        if mass_cnt<5:
            continue
        else:
            if len(check_d)==1:
                new_index=[0,2,4,6]
            else:
                new_index=[1,3,5,7]

            new_mass=mass_cnt//5
            new_speed=speed_cnt//cnt
            for nd in new_index:
                last_index+=1
                kv_fireball[last_index]=[mr,mc,new_mass,new_speed,nd]
                map_data[mr][mc].append(last_index)



n,m,k=map(int,input().split())

fireball=list()

for _ in range(m):
    r,c,m,s,d=map(int,input().split())
    fireball.append([r-1,c-1,m,s,d])


map_data=[[list() for _ in range(n)] for _ in range(n)]

kv_fireball=defaultdict(list)
last_index=0
for i in range(len(fireball)):
    r,c,m,s,d=fireball[i]
    map_data[r][c].append(i)
    kv_fireball[i]=[r,c,m,s,d]
    last_index=i


for _ in range(k):
    move()

ans=0
for key in kv_fireball.keys():
    r,c,m,s,d=kv_fireball[key]
    ans+=m

print(ans)