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

-·2022년 4월 25일
0

알고리즘

목록 보기
12/16

문제

input

첫째 줄에 N, M, K가 주어진다.

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

서로 다른 두 파이어볼의 위치가 같은 경우는 입력으로 주어지지 않는다.

output

마법사 상어가 이동을 K번 명령한 후, 남아있는 파이어볼 질량의 합을 출력한다.

TODO

1. 파이어볼 별 위치,질량,속도,방향 dict형태로 저장 
2. 2차원 배열 초기화 
	-> (파이어볼의 질량,속도,방향(홀짝),개수, 파이어볼 key)로 초기화
3.파이어볼 이동 
	-> 2차원배열 파이어볼 움직인 좌표에 정보 갱신
    -> 이미 파이어볼이 존재하면 질량,속도,방향계산,개수 더하고 key삭제 
4. 2차원 배열에 남은 파이어볼 다시 dict형태로 저장 

5. k번 반복

CODE

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)

회고

파이어볼이 쪼개지면 한 좌표에 파이어볼이 여러개.. 문제를 이해하기가 힘들었다.

profile
-

0개의 댓글

관련 채용 정보