|
| 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