첫째 줄에 N, M, K가 주어진다.
둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다.
서로 다른 두 파이어볼의 위치가 같은 경우는 입력으로 주어지지 않는다.
마법사 상어가 이동을 K번 명령한 후, 남아있는 파이어볼 질량의 합을 출력한다.
1. 파이어볼 별 위치,질량,속도,방향 dict형태로 저장
2. 2차원 배열 초기화
-> (파이어볼의 질량,속도,방향(홀짝),개수, 파이어볼 key)로 초기화
3.파이어볼 이동
-> 2차원배열 파이어볼 움직인 좌표에 정보 갱신
-> 이미 파이어볼이 존재하면 질량,속도,방향계산,개수 더하고 key삭제
4. 2차원 배열에 남은 파이어볼 다시 dict형태로 저장
5. k번 반복
import sys
n,m,k = map(int,sys.stdin.readline().split())
fire = {}
fk = 1
for _ in range(1,m+1):
fire[fk] = list(map(int,sys.stdin.readline().split()))
fire[fk][0]-=1
fire[fk][1]-=1
fk+=1
direction = [(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)]
#ri, ci, mi, si, di
def command(fire,k):
global fk
world = [[[0,0,0,0,0,True] for _ in range(n)] for _ in range(n)]
for _ in range(k) :
fire_list = list(fire.keys())
for key in fire_list:
r,c,m,s,d = fire[key]
r,c = (r+direction[d][0]*s)%n, (c+direction[d][1]*s)%n
if world[r][c][0] != 0 : #이미 존재하면 ?! m,s,d,cnt
world[r][c][0] += m
world[r][c][1] += s
if world[r][c][5] and world[r][c][2] != d%2:
world[r][c][5] = False
world[r][c][3] +=1
del fire[key]
else :
world[r][c][0] = m
world[r][c][1] = s
world[r][c][2] = d%2
world[r][c][3] = 1
world[r][c][4] = key
fire[key][0],fire[key][1] = r,c
for i in range(n):
for j in range(n):
if world[i][j][3] == 0 :
continue
if world[i][j][3]>1 :
m,s,d,cnt,key,check = world[i][j]
d = 0 if check else 1
m = m // 5
if m != 0 :
s = s//cnt
for dir in range(d,8,2):
fire[fk] = [i,j,m,s,dir]
fk+=1
del fire[key]
world[i][j] = [0,0,0,0,0,True]
command(fire,k)
answer = 0
for value in fire.values():
answer+=value[2]
print(answer)
파이어볼이 쪼개지면 한 좌표에 파이어볼이 여러개.. 문제를 이해하기가 힘들었다.