본문 바로가기

TIL

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

문제

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

 

21610번: 마법사 상어와 비바라기

마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기

www.acmicpc.net


마법사 상어와 파이어 볼을 풀고 심심해서 풀어봤는데, 단순한 구현 문제였다. 문제에서 말하는 조건만 잘 지키면 된다.

 

파이어 볼 때랑 비슷하게 체크해야 될 부분은 N행 또는 N열을 넘으면 다시 첫번째 열과 행으로 올 수 있으니까 나머지를 계산해서 바꿔 주면 된다.


소스코드 

import sys
input = sys.stdin.readline

N, M = map(int, input().split())

dy = [0, -1, -1, -1, 0, 1, 1, 1]
dx = [-1, -1, 0, 1, 1, 1, 0, -1]

di_y = [-1, -1, 1, 1]
di_x = [-1, 1, 1, -1]
cloud = []
arr = [[0 for _ in range(N)] for _ in range(N)]

for i in range(N):
    arr[i] = list(map(int, input().split()))

cmd = []
for _ in range(M):
    d, len = map(int, input().split())
    cmd.append([d-1, len])


cloud.append([N-1, 0])
cloud.append([N-1, 1])
cloud.append([N-2, 0])
cloud.append([N-2, 1])

for dir in range(M):
    ch = [[0]*N for _ in range(N)]
    moved = []
    while cloud:
        y, x = cloud.pop(0)

        yy = (y+dy[cmd[dir][0]]*cmd[dir][1]) % N
        xx = (x+dx[cmd[dir][0]]*cmd[dir][1]) % N
        ch[yy][xx] = 1
        arr[yy][xx] += 1
        moved.append([yy, xx])
    for mv in moved:
        y = mv[0]
        x = mv[1]
        for d in range(4):
            yy = y+di_y[d]
            xx = x+di_x[d]
            if yy < 0 or xx < 0 or yy >= N or xx >= N:
                continue
            if arr[yy][xx] != 0:
                arr[y][x] += 1
    for i in range(N):
        for j in range(N):
            if ch[i][j] != 1 and arr[i][j] >= 2:
                cloud.append([i, j])
                arr[i][j] -= 2

ans = 0
for i in range(N):
    for j in range(N):
        ans += arr[i][j]


print(ans)

'TIL' 카테고리의 다른 글

프로그래머스 풍선 터트리기  (0) 2021.12.31
백준 합분해 2 13707 (c++)  (0) 2021.12.08
Red–black tree  (4) 2021.09.07
백준 2098 외판원 순회(python)  (1) 2021.08.30
백준 22239 가희와 읽기 쓰기 놀이2(python)  (1) 2021.08.28