728x90
반응형
https://www.acmicpc.net/problem/21610
21610번: 마법사 상어와 비바라기
마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기
www.acmicpc.net
문제 해결
- 순서대로 구현하면 어렵지 않은 문제
- 구름의 좌표를 모은 다음 주어진 방향, 주어진 크기만큼 이동해서 비를 +1씩 내려준다.
- 이 때 동시에 일어나도 모두 같은방향, 같은 크기만큼 가기 때문에 구름이 겹칠 일이 없다.
- 비가 내린 곳에서는 물복사를 할 거기 때문에 좌표를 리스트를 만들어 저장한다.
- 구름은 이제 모두 없고 물복사 할 곳 좌표에 차례대로 물복사를 한다.
- 이 때는 동시에 일어나기 때문에 하나씩 조사를 하면 전에 물 복사 한 곳이 조사하는 곳의 물 복사 조건에 영향을 주기 때문에 이전 비의 양을 나타내는 그래프를 복사를 한 후 새로운 그래프에 메모를 한다.
- 구름이 생기는 곳에 구름을 만들고 물의 양을 -2한다.
CODE
n, m = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
move = ((0,-1),(-1,-1),(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1))
clouds = [(n-2,0),(n-2,1),(n-1,0),(n-1,1)]
dxs = [-1,-1,1,1]
dys = [-1,1,-1,1]
for t in range(m):
d, s = map(int, input().split())
copy_clouds = []
for x,y in clouds:
nx = (x + move[d-1][0]*s)%n
ny = (y + move[d-1][1]*s)%n
board[nx][ny] += 1
copy_clouds.append((nx,ny))
clouds = []
new_board = [[0]*n for _ in range(n)]
for i in range(n):
for j in range(n):
new_board[i][j] = board[i][j]
for i, j in copy_clouds:
cnt = 0
for dx, dy in zip(dxs,dys):
if 0<=i+dx<n and 0<=j+dy<n and board[i+dx][j+dy]>0:
cnt += 1
new_board[i][j] += cnt
for i in range(n):
for j in range(n):
if (i,j) not in copy_clouds and new_board[i][j] >=2:
clouds.append((i,j))
new_board[i][j] -= 2
board[i][j] = new_board[i][j]
answer = 0
for i in range(n):
answer += sum(board[i])
print(answer)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 1431 시리얼 번호 (0) | 2023.07.11 |
---|---|
[python] 백준 3986 좋은 단어 (0) | 2023.07.10 |
[python] 백준 21609 상어 중학교 (0) | 2023.07.08 |
[python] 백준 2159 케익 배달 (0) | 2023.07.07 |
[python] 백준 5567 결혼식 (0) | 2023.07.04 |
댓글