백준 20056번 마법사 상어와 파이어볼 (Python 3)
2022. 10. 18. 15:13ㆍProblem 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)
'Problem solving' 카테고리의 다른 글
백준 27294번 몇개고? (Python 3) (0) | 2023.04.04 |
---|---|
백준 5615번 아파트 임대 (Python 3) (1) | 2022.09.23 |
백준 11402번 이항 계수 4 (Python 3) (1) | 2022.09.23 |
백준 1413번 박스 안의 열쇠 (Python 3) (0) | 2022.09.16 |
백준 4179번 불! (Python 3) (1) | 2022.09.16 |