본문 바로가기
카테고리 없음

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

by Alan_Kim 2023. 6. 22.
728x90
반응형

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

 

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

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

www.acmicpc.net

 

문제 해결

  • 조건이 한 번에 이해하기 까다로웠다.
  • 이동을 할 때 n행과 1행이 연결되어있어서 n행을 넘어가면 1행으로 텔레포트(?)가 가능하고 1열과 n열이 연결되어있어 n열이 넘어가면 1열로 텔레포트가 가능하다.
  • 그리고 바닥 함수가 기호로 써져있어서 알지 못하면 처음에 이해하기 어려울 수 있다.

https://ko.wikipedia.org/wiki/%EB%B0%94%EB%8B%A5_%ED%95%A8%EC%88%98%EC%99%80_%EC%B2%9C%EC%9E%A5_%ED%95%A8%EC%88%98

 

바닥 함수와 천장 함수 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 수학과 컴퓨터 과학에서 바닥 함수(영어: floor function)는 각 실수 이하의 최대 정수를 구하는 함수이다. 천장 함수(天障函數, 영어: ceiling function)는 각 실수 이상

ko.wikipedia.org

나머지는 조건을 이해하는데 큰 어려움은 없었으며 그래프를 이용하면 쉽게 풀 수 있다.

 

CODE

import math
def simulate():
    global board
    temp = [[[] for _ in range(n)]for _ in range(n)]
    dxs = [-1,-1,0,1,1,1,0,-1]
    dys = [0,1,1,1,0,-1,-1,-1]
    for i in range(n):
        for j in range(n):
            for k in range(len(board[i][j])):
                mi,si,di = board[i][j][k]
                ni = (i + dxs[di]*si)%n
                nj = (j + dys[di]*si)%n
                temp[ni][nj].append([mi,si,di])
    # for i in range(n):
    #     print(temp[i])
    board = [[[] for _ in range(n)]for _ in range(n)]
    for i in range(n):
        for j in range(n):
            if len(temp[i][j]) >=2:
                m = 0
                s = 0
                d = temp[i][j][-1][-1]
                flag = True
                for k in range(len(temp[i][j])):
                    m += temp[i][j][k][0]
                    s += temp[i][j][k][1]
                    if d%2 != temp[i][j][k][2]%2:
                        flag = False
                if math.floor(m/5) ==0: continue
                for c in range(4):
                    if flag:
                        board[i][j].append([math.floor(m/5),math.floor(s/len(temp[i][j])),2*c])
                    else:
                        board[i][j].append([math.floor(m/5),math.floor(s/len(temp[i][j])),2*c+1])
            elif len(temp[i][j])==1:
                board[i][j].append(temp[i][j][0])
if __name__=='__main__':
    n, m, k = map(int, input().split())
    board = [[[] for _ in range(n)]for _ in range(n)]
    answer = 0
    for _ in range(m):
        ri,ci,mi,si,di = map(int, input().split())
        board[ri-1][ci-1].append([mi,si,di])
    for _ in range(k):
        simulate()
    for i in range(n):
        for j in range(n):
            for c in range(len(board[i][j])):
                answer += board[i][j][c][0]
    print(answer)
728x90
반응형

댓글