Algorithm (PS)

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

minjiwoo 2022. 9. 28. 22:05
728x90

https://www.acmicpc.net/problem/20056

 

20056번: 마법사 상어와 파이어볼

첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치

www.acmicpc.net

삼성의 상어 시리즈.. 
https://sinclairstudio.tistory.com/202

 

백준 21610 마법사 상어와 비바라기 (python)

https://www.acmicpc.net/problem/21610 21610번: 마법사 상어와 비바라기 마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기

sinclairstudio.tistory.com

마법사 상어와 비바라기 이 문제와 비슷하거나 조금 더 쉬운 듯 하다 

처음에는 array에 fireball의 질량, 속도 정보가 계속 바뀌는데 어떻게 저장할까 하다가 list 자료구조를 사용하기로 했다 

# 20056

N, M, K = map(int, input().split())
answer = 0 # 질량의 합
fireball = []
array = [[[] for i in range(N)] for _ in range(N)]
# 방향
dx = [-1, -1, 0, 1, 1, 1, 0, -1]
dy = [0, 1, 1, 1, 0, -1, -1, -1]

for _ in range(M):
    r, c, m, s, d = map(int, input().split())
    fireball.append([r-1, c-1, m, s, d])

for _ in range(K): # K 회 명령하기
    while fireball:
        x, y, m, s, d = fireball.pop(0)
        # 이동하기
        nx = (x + dx[d] * s) % N
        ny = (y + dy[d] * s) % N
        array[nx][ny].append([m, s, d])
        # 2개 이상인지 확인하기
    for i in range(N):
        for j in range(N):
            if len(array[i][j]) > 1:
                # 파이어볼 합치기
                new_m = 0  # 파이어볼 질량의 합
                new_s = 0
                count = len(array[i][j])  # (i,j)에 있는 파이어볼의 개수
                odd = 0
                even = 0
                while array[i][j]:
                    mm, ss, dd = array[i][j].pop(0)
                    new_m += mm
                    new_s += ss
                    if dd % 2:
                        even += 1
                    else:
                        odd += 1
                if new_m // 5:
                    if even == count or odd == count:
                        # 0, 2, 4, 6
                        for dir in [0, 2, 4, 6]:
                            fireball.append([i, j, new_m // 5, new_s // count, dir])
                    else:
                        # 1, 3, 5, 7
                        for dir in [1, 3, 5, 7]:
                            fireball.append([i, j, new_m // 5, new_s // count, dir])

            if len(array[i][j]) == 1:
                fireball.append([i, j] + array[i][j].pop(0))

answer = 0
for f in fireball:
    answer += f[2]
print(answer)
728x90