코테/코딩테스트 대비 Python

백준 마법사 상어와 파이어볼 Python

밤밭황제 2023. 5. 22. 22:47

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)
728x90