[BaekJoon] 백준 20057번 마법사 상어와 토네이도
🎈문제
https://www.acmicpc.net/problem/20057
💬설명
- 1시간 10분 정도 걸렸다. 마지막에 % 계산을 잘못 해줘서 틀렸다가 다시 품
- 포인트는 1. 회오리 모양으로 돌기 2. 모래가 흩어질때 방향에 따라 어느 위치에 몇 퍼센트 퍼질지 였던 것 같다. 모두 방향만 잘 설정해주면 쉽게 풀 수 있다. 근데 그 방향을 설정하는게 꽤 까다로웠다,, 수학문제 느낌,,
👩💻코드
# BaekJoon20057.py
N = int(input())
arr = [[] for _ in range(N)]
for i in range(N):
arr[i] = list(map(int, input().split()))
dx = [0, 1, 0, -1]
dy = [-1, 0, 1, 0]
result = 0
def spread(x, y, d):
global arr, dx, dy, N, result
amount = arr[x][y]
arr[x][y] = 0
alpa = amount
percent = [1, 2, 7, 10, 5]
direction = [[[-1, -2], [1, -2]], [[1, 1], [-1, -1]], [[1], [-1]], [[0, 1], [0, -1]], [[0, 0]]]
for i in range(5):
spreaded = amount * percent[i] // 100
direction_i = direction[i]
for j in direction_i:
nx = x
ny = y
for k in j:
nx += dx[(d + k) % 4]
ny += dy[(d + k) % 4]
if nx < 0 or ny < 0 or nx >= N or ny >= N:
result += spreaded
alpa -= spreaded
else:
arr[nx][ny] += spreaded
alpa -= spreaded
# 알파
nx = x + dx[d]
ny = y + dy[d]
if nx < 0 or ny < 0 or nx >= N or ny >= N:
result += alpa
else:
arr[nx][ny] += alpa
def solution():
global arr, dx, dy, N
direction = 0
num = 1
cur = [(N - 1) // 2, (N - 1) // 2]
is_over = False
while not is_over:
for i in range(2):
for j in range(num):
cur[0] += dx[direction]
cur[1] += dy[direction]
if cur[0] < 0 or cur[1] < 0 or cur[0] >= N or cur[1] >= N:
is_over = True
break
spread(cur[0], cur[1], direction)
direction = (direction + 1) % 4
if is_over:
break
num += 1
print(result)
solution()
728x90
반응형
'CS > Algorithm 문제' 카테고리의 다른 글
[BaekJoon] 백준 16235번 나무 재테크 (0) | 2021.10.21 |
---|---|
[BaekJoon] 백준 20058번 마법사 상어와 파이어스톰 (0) | 2021.10.21 |
[BaekJoon] 백준 21611번 마법사 상어와 블리자드 (0) | 2021.10.20 |
[BaekJoon] 백준 21610번 마법사 상어와 비바라기 (0) | 2021.10.20 |
[BaekJoon] 백준 14889번 스타트와 링크 (0) | 2021.10.20 |