https://www.acmicpc.net/problem/21610
21610번: 마법사 상어와 비바라기
마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기
www.acmicpc.net
from collections import deque
import sys
n,m = map(int,sys.stdin.readline().split())
basket = []
for _ in range(n):
basket.append(list(map(int,sys.stdin.readline().split())))
dx = [ 0, -1, -1, -1, 0, 1, 1, 1]
dy = [-1, -1, 0, 1, 1, 1, 0, -1]
cloud = deque([[n-1, 0], [n-1, 1], [n-2, 0], [n-2, 1]])
for _ in range(m):
d,s = map(int,sys.stdin.readline().split())
d -= 1
c = [[0] * n for _ in range(n)]
cloudlen = len(cloud)
while cloudlen:
x,y = cloud.popleft()
nx = x + s*dx[d]
ny = y + s*dy[d]
if nx < 0:
nx = (n - 1) - (((-1) * nx - 1) % n)
elif nx >= n:
nx %= n
if ny < 0:
ny = (n - 1) - (((-1) * ny - 1) % n)
elif ny >= n:
ny %= n
basket[nx][ny] += 1
cloudlen -=1
c[nx][ny] = 1
cloud.append([nx,ny])
copy_water = [[-1,-1],[-1,1],[1,-1],[ 1, 1]]
for i,j in cloud:
cnt = 0
for k,l in copy_water:
nx = i + k
ny = j + l
if 0 <= nx < n and 0 <= ny < n:
if basket[nx][ny] != 0:
cnt += 1
basket[i][j] += cnt
cloud = deque()
for i in range(n):
for j in range(n):
if basket[i][j] >=2 and c[i][j] == 0:
basket[i][j] -= 2
cloud.append([i,j])
print(sum(sum(a) for a in basket))
이렇게 풀었는데
사실 ~ not in ~~를 사용했는데
그게 시간을 많이 잡아 먹나보다
어렵다 어려워 구현도 조건에 맞게하면 된다.
그러나
if nx < 0:
nx = (n - 1) - (((-1) * nx - 1) % n)
elif nx >= n:
nx %= n
if ny < 0:
ny = (n - 1) - (((-1) * ny - 1) % n)
elif ny >= n:
ny %= n
이 풀이가 다른 분이 한걸 옮겨온건데 내가 시험장에서 이걸 생각할수 있을까...?
반응형
'알고리즘 공부 > 구현' 카테고리의 다른 글
| [백준] 15685번 드래곤 커브- 파이썬 (0) | 2022.03.30 |
|---|---|
| [백준] 14891번 톱니바퀴- 파이썬 (0) | 2022.03.27 |
| [백준] 21608번 상어 초등학교 - 파이썬 (0) | 2022.03.25 |
| [백준] 20055번 컨베이어 벨트 위의 로봇 - 파이썬 (0) | 2022.02.25 |
| [백준] 5622번 다이얼 - 파이썬 (0) | 2021.05.10 |