https://www.acmicpc.net/problem/20056
20056번: 마법사 상어와 파이어볼
첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치
www.acmicpc.net
헤멨던 부분:
1. "파이어볼 질량의 합"을 출력해야 하는데 파이어볼의 갯수를 구하고 있었다.
2. 명령의 2번 과정에서 파이어볼들이 나누어지고 이동하는 줄 알았음
느낀점:
예제의 출력이 왜 그렇게 나오는 지 생각하고 풀어야겠다.
예제 설명
첫 명령의 1번 과정 이후 (각 (m, v, d)는 질량 m, 속력 v, 방향 d인 파이어볼을 의미함)
[] [] [(5, 2, 2), (7, 1, 6)] []
[] [] [] []
[] [] [] []
[] [] [] []
첫 명령의 2번 과정 이후
[] [] [(2, 1, 0), (2, 1, 2), (2, 1, 4), (2, 1, 6)] []
[] [] [] []
[] [] [] []
[] [] [] []
두 번째 명령의 1번 과정 이후
[] [(2, 1, 6)] [] [(2, 1, 2)]
[] [] [(2, 1, 4)] []
[] [] [] []
[] [] [(2, 1, 0)] []
두 번째 명령의 2번 과정 이후
[] [(2, 1, 6)] [] [(2, 1, 2)]
[] [] [(2, 1, 4)] []
[] [] [] []
[] [] [(2, 1, 0)] []
import math
N,M,K = map(int, input().split())
# 위 대각선위오 오, 대각선아래오, 아래, 대각선아래왼, 왼, 대각선위왼
dx = [-1,-1,0, 1, 1, 1, 0, -1 ]
dy = [0, 1, 1, 1, 0, -1, -1, -1]
dic = {}
ans = M
for i in range(M):
r, c, m, s, d = map(int, input().split())
dic[(r-1,c-1)] = [(m,s,d)]
def move(x, y, d, s):
nx = (x + dx[d] * s) % N
ny = (y + dy[d] * s) % N
if nx < 0:
nx = N + nx
if ny < 0:
ny = N + ny
return (nx, ny)
for i in range(K):
newdic = {}
for key, val in dic.items():
x, y = key
for j in range(len(val)):
m, s, d = val[j]
nx, ny = move(x, y, d, s)
if (nx, ny) not in newdic:
newdic[(nx, ny)] = [(m, s, d)]
else:
newdic[(nx, ny)].append((m, s, d))
dic = {}
ans = 0
for key, val in newdic.items():
x, y = key
nm = 0
nd = 0 # 모두 짝or홀 => nd = 0
ns = 0
dlst = []
if len(val) > 1:
msum = 0
ssum = 0
direction = val[0][2] % 2
valsd =[]
for j in range(len(val)):
m, s, d = val[j]
msum += m
ssum += s
if d % 2 != direction:
nd = 1
nm = math.floor(msum / 5)
ns = math.floor(ssum / len(val))
if nd == 0:
dlst = [0, 2, 4, 6]
else:
dlst = [1, 3, 5, 7]
if nm > 0:
ans += nm * 4
for t in range(4):
if (x, y) not in dic:
dic[(x, y)] = [(nm, ns, dlst[t])]
else:
dic[(x, y)].append((nm, ns, dlst[t]))
else:
m, s, d = val[0]
ans += m
if (x, y) not in dic:
dic[(x, y)] = [(m, s, d)]
else:
dic[(x, y)].append((m, s, d))
print(ans)
'코테 > 코딩테스트 대비 Python' 카테고리의 다른 글
LCS 설명 & 파이썬 코드 (0) | 2023.11.06 |
---|---|
백준 스타트 택시 (0) | 2023.05.25 |
백준 인구이동 BFS (1) | 2023.05.21 |
2차원 배열 회전 (0) | 2023.05.18 |
백준 20115 (0) | 2023.03.01 |