728x90
📌 문제
https://www.acmicpc.net/problem/20057
📌 문제 접근 방법
- 우선 토네이도가 이동하는 부분 먼저 구현해줬다.
- 출발은 (N//2, N//2)에서 한다.
- 왼쪽 -> 아래 -> 오른쪽 -> 위 의 방향 순서대로 움직이기 때문에 이에 맞춰 델타 행렬을 만들어준다.
- 1칸씩 2번, 2칸씩 2번, 3칸씩 2번 ... 이런식으로 이동하길래 cnt를 2로 초기화 한 후
2번 이동이 끝나면 값이 변경되도록 cnt를 2로 나눈 몫만큼 이동을 시켰다.
- 그리고 모래가 흩날리는 비율의 인덱스를 하나하나 생각해주고 모래 비율도 하나하나 생각해서
만약 인덱스가 배열을 넘어가면 result에 더해주고 아니라면 배열의 해당 인덱스에 더해줬다.
📌 코드
# 백준 20057 마법사 상어와 토네이도
def spread(x, y, sand):
global arr, result
if 0 <= x < N and 0 <= y < N:
arr[x][y] += sand
else:
result += sand
def tornado(x ,y):
# (x, y) : 그림 상의 x
dxy = [(0, -1), (1, 0), (0, 1), (-1, 0)] # 왼 아 오 위
cnt = 2
i = 4
while True:
for _ in range(cnt//2):
nx = x + dxy[i%4][0]
ny = y + dxy[i%4][1]
# (nx, ny) : 그림 상의 y
temp = arr[nx][ny]
# 1%
spread(x + dxy[(i-1)%4][0], y + dxy[(i-1)%4][1], int(temp*0.01))
spread(x + dxy[(i+1)%4][0], y + dxy[(i+1)%4][1], int(temp*0.01))
# 7%
spread(nx + dxy[(i-1)%4][0], ny + dxy[(i-1)%4][1], int(temp*0.07))
spread(nx + dxy[(i+1)%4][0], ny + dxy[(i+1)%4][1], int(temp*0.07))
# 2%
spread(nx + dxy[(i-1)%4][0]*2, ny + dxy[(i-1)%4][1]*2, int(temp*0.02))
spread(nx + dxy[(i+1)%4][0]*2, ny + dxy[(i+1)%4][1]*2, int(temp*0.02))
# 10%
spread(nx + dxy[i%4][0] + dxy[(i-1)%4][0], ny + dxy[i%4][1] + dxy[(i-1)%4][1], int(temp*0.1))
spread(nx + dxy[i%4][0] + dxy[(i+1)%4][0], ny + dxy[i%4][1] + dxy[(i+1)%4][1], int(temp*0.1))
# 5%
spread(nx + dxy[i%4][0]*2, ny + dxy[i%4][1]*2, int(temp*0.05))
# a
left = temp - int(temp*0.01)*2 - int(temp*0.07)*2 - int(temp*0.02)*2 - int(temp*0.1)*2 - int(temp*0.05)
spread(nx + dxy[i%4][0], ny + dxy[i%4][1], left)
arr[nx][ny] = 0
if nx == 0 and ny == 0:
return
else:
x, y = nx, ny
i += 1
cnt += 1
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
result = 0
tornado(N//2, N//2)
print(result)
728x90
'ALGORITHM > BAEKJOON' 카테고리의 다른 글
[BOJ/Python] 14719. 빗물 (0) | 2021.10.29 |
---|---|
[BOJ/Python] 2688. 줄어들지 않아 (0) | 2021.10.28 |
[BOJ/Python] 4948. 베르트랑 공준 (0) | 2021.10.21 |
[BOJ/Python] 1197. 최소 스패닝 트리 (0) | 2021.10.21 |
[BOJ/Python] 1717. 집합의 표현 (0) | 2021.10.21 |
댓글