Skip to content

Commit 086597f

Browse files
committed
[BOJ] 마법사 상어와 파이어볼 / 골드 4 / 180분
https://www.acmicpc.net/problem/20056
1 parent 7f06b5f commit 086597f

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import math
2+
from collections import defaultdict
3+
4+
N, M, K = map(int, input().split())
5+
6+
# 파이어볼을 나타내는 배열, 순서대로 (x위치, y위치, 질량, 속력, 방향)
7+
fire_balls = []
8+
9+
ans = 0
10+
11+
# 방향을 나타내는 배열
12+
dir = [(-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1), (-1, -1)]
13+
14+
# 파이어볼을 위치별로 묶어두기 위한 딕셔너리
15+
fire_balls_position = defaultdict(list)
16+
17+
# 파이어볼 위치 기록 (위치별 파이어볼 목록)
18+
for _ in range(M):
19+
r, c, m, s, d = map(int, input().split())
20+
fire_balls.append((r, c, m, s, d))
21+
22+
# K번 만큼 파이어볼 이동
23+
for _ in range(K):
24+
# 새 위치로 이동한 파이어볼을 임시로 기록
25+
fire_balls_position.clear()
26+
27+
for r, c, m, s, d in fire_balls:
28+
# 파이어볼을 방향과 속력에 따라 이동
29+
dx, dy = dir[d]
30+
r = ((r + dx * s - 1) % N) + 1
31+
c = ((c + dy * s - 1) % N) + 1
32+
33+
# 새로운 위치에 파이어볼을 추가
34+
fire_balls_position[(r, c)].append((r, c, m, s, d))
35+
36+
# 파이어볼 합치기
37+
fire_balls.clear()
38+
for (r, c), balls in fire_balls_position.items():
39+
if len(balls) > 1: # 한 위치에 2개 이상 파이어볼이 있을 경우
40+
# 질량, 속력, 방향 계산
41+
m_sum = sum(ball[2] for ball in balls)
42+
s_sum = sum(ball[3] for ball in balls)
43+
count = len(balls)
44+
45+
# 짝수, 홀수 방향 판별
46+
flag = -1
47+
for _, _, _, _, d in balls:
48+
if flag == -1:
49+
flag = d
50+
elif flag % 2 != d % 2:
51+
flag = -10 # 홀수, 짝수 혼합
52+
53+
# 질량이 0보다 크면 4개로 나눈다
54+
if m_sum // 5 > 0:
55+
if flag == -10:
56+
fire_balls.extend([(r, c, m_sum // 5, s_sum // count, i) for i in [1, 3, 5, 7]])
57+
else:
58+
fire_balls.extend([(r, c, m_sum // 5, s_sum // count, i) for i in [0, 2, 4, 6]])
59+
else:
60+
# 1개일 경우 그대로 남긴다
61+
fire_balls.extend(balls)
62+
63+
# 결과 출력
64+
ans = sum(m for _, _, m, _, _ in fire_balls)
65+
print(ans)

0 commit comments

Comments
 (0)