티스토리 뷰

문제

 

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

 

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

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

www.acmicpc.net

 

 

풀이

 

오래걸렸음. 일단 문제를 제대로 안읽음.

윗줄만 읽고 r, c, m, d, s로 값이 주어지는 줄 알았는데 입력 부분을 보니까 s랑 d랑 바뀌여있었음. 내탓임.

 

아무튼,

 

명령이 실행될때마다 가장 먼저 파이어볼들의 위치를 이동시켜주었음. 

(x,y,m,s,d)로 주어지므로, 새로운 x는 ball[0]에 d와 s를 곱한 값을 더해주었음. y도 마찬가지로 진행한 후에 n으로 나눈 나머지를 x, y값으로 정해주었음.(보드가 이어져있기때문)

이때, 파이어볼들의 위치가 정해진 후에 board[newX][newY]에 파이어볼들을 추가해주었음.

 

다음으로 board의 칸을 확인하면서 파이어볼이 한 개인 경우엔 다시 fireballs에 append해줬음. popleft()를 이용했기때문에 매번 board를 초기화해주지 않아도됨.

만약 파이어볼이 두 개 이상인 경우엔 board[i][j]가 빌때까지 조건을 확인해주면서 fireballs에 넣어주었음.

어차피 위치는 그대로이므로 질량 합, 속도 합, 방향 상태만 확인하면됨.

만약 질량 합을 count로 나눈 몫이 0이라면 continue를 이용해 fireballs에 추가하지않았음.

 

import sys
from collections import deque
input = sys.stdin.readline

n,m,k = map(int,input().split())
board = [[deque() for _ in range(n)] for _ in range(n)]
moveDir = [(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)]
fireballs = deque()
for _ in range(m):
    x,y,m,s,d = map(int,input().split())
    fireballs.append((x - 1,y - 1,m,s,d))
for _ in range(k):
    while fireballs:
        ball = fireballs.popleft()
        newX = ball[0] + moveDir[ball[4]][0] * ball[3]
        newY = ball[1] + moveDir[ball[4]][1] * ball[3]
        newX %= n
        newY %= n
        board[newX][newY].append((newX,newY,ball[2],ball[3],ball[4]))
    for i in range(n):
        for j in range(n):
            if len(board[i][j]) == 1:
                fireballs.append(board[i][j].popleft())
            elif len(board[i][j]) > 1:
                count = len(board[i][j])
                sumM, sumS, odd, even = 0,0,0,0
                while board[i][j]:
                    temp = board[i][j].popleft()
                    sumM += temp[2]
                    sumS += temp[3]
                    if temp[4] % 2 == 0:
                        even += 1
                    else:
                        odd += 1
                newM = sumM // 5
                if newM == 0:
                    continue
                newS = sumS // count
                if odd == 0 or even == 0:
                    newDir = [0,2,4,6]
                else:
                    newDir = [1,3,5,7]
                for dir in newDir:
                    fireballs.append((i,j,newM,newS,dir))
result = 0
for i in range(len(fireballs)):
    result += fireballs[i][2]
print(result)

 

 

_____________________________________________________________________________________________________

 

 

문제 잘읽어야함

댓글
최근에 올라온 글
Total
Today
Yesterday