Skip to content

Commit 9b14c17

Browse files
committed
[BOJ] 20056 마법사 상어와 파이어볼 (G4)
1 parent 9b3f39a commit 9b14c17

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed

최어진/8주차/260220.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# 백준 20056번: 마법사 상어와 파이어볼 (2회차)
2+
3+
from collections import deque
4+
import sys
5+
6+
input = sys.stdin.readline
7+
8+
# N <= 50, M <= M^2
9+
# K <= 10^3
10+
N, M, K = map(int, input().rstrip().split())
11+
fireballs = deque()
12+
13+
for _ in range(M):
14+
r, c, mass, speed, direction = map(int, input().rstrip().split())
15+
fireballs.append((r - 1, c - 1, mass, speed, direction))
16+
# print((r - 1, c - 1), ':', (mass, speed, direction))
17+
# print()
18+
19+
# 모든 이동 횟수 -> 10^3
20+
# 이동마다의 파이어볼의 동작
21+
# 1. 모두 각자 이동 -> O(N^2) * 10^3 ~= 10^6 ~ 10^7 -> 이 부분 최적화가 핵심
22+
# 2. 합쳐짐 -> O(N^2) ~= 10^3
23+
24+
moves = {
25+
0: [-1, 0],
26+
1: [-1, 1],
27+
2: [0, 1],
28+
3: [1, 1],
29+
4: [1, 0],
30+
5: [1, -1],
31+
6: [0, -1],
32+
7: [-1, -1],
33+
}
34+
maps = [[[] for _ in range(N)] for _ in range(N)]
35+
36+
def print_fireballs():
37+
for r, c, m, s, d in fireballs:
38+
print((r, c), ':', (m, s, d))
39+
40+
def fireball_move():
41+
while fireballs:
42+
r, c, mass, speed, direction = fireballs.popleft()
43+
dr, dc = moves[direction]
44+
45+
new_r, new_c = (r + dr * speed + 1000 * N) % N, (c + dc * speed + 1000 * N) % N
46+
maps[new_r][new_c].append((mass, speed, direction))
47+
48+
return maps
49+
50+
def fireball_merge():
51+
for r in range(N):
52+
for c in range(N):
53+
if len(maps[r][c]) > 1:
54+
ave_mass = 0
55+
ave_speed = 0
56+
ave_direction = [0, 0]
57+
for mass, speed, direction in maps[r][c]:
58+
ave_mass += mass
59+
ave_speed += speed
60+
ave_direction[direction % 2] += 1
61+
62+
ave_mass = ave_mass // 5
63+
if ave_mass == 0:
64+
maps[r][c].clear()
65+
continue
66+
67+
ave_speed = ave_speed // len(maps[r][c])
68+
69+
next_directions = [0, 2, 4, 6] if ave_direction[0] == 0 or ave_direction[1] == 0 else [1, 3, 5, 7]
70+
for direction in next_directions:
71+
fireballs.append((r, c, ave_mass, ave_speed, direction))
72+
maps[r][c].clear()
73+
elif maps[r][c]:
74+
fireballs.append((r, c, *maps[r][c][0]))
75+
maps[r][c].clear()
76+
77+
for i in range(K):
78+
# print(f'{i}th query')
79+
fireball_move()
80+
# print('after move:')
81+
# for r in range(N):
82+
# for c in range(N):
83+
# if maps[r][c]:
84+
# print(f'({r}, {c}):', maps[r][c])
85+
# print('after merge:')
86+
fireball_merge()
87+
# print_fireballs()
88+
# print('-----------')
89+
# print()
90+
91+
print(sum([mass for _, _, mass, _, _ in fireballs]))

0 commit comments

Comments
 (0)