Algorithm/Python
[파이썬/백준 20057] 마법사 상어와 토네이도
박한결
2021. 3. 24. 23:37
20057번: 마법사 상어와 토네이도
마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을
www.acmicpc.net
시간 줄이려고 global안쓰고 딕셔너리 써봤는데 메모리가 줄어들고 시간은 늘어났다
✨ 접근
위와 같은 그림을 그리며 패턴을 파악했다
✨ 코드
딕셔너리 쓰기
def move(cnt, dx, dy, direction):
for _ in range(cnt + 1):
sx, sy = init['sx'] + dx, init['sy'] + dy
init['sx'], init['sy'] = sx, sy
if sx < 0 or sy < 0:
break
spreads = 0
for dx, dy, r in rate[direction]:
nx = sx + dx
ny = sy + dy
if r == 0:
sand = desert[sx][sy] - spreads
else:
sand = int(desert[sx][sy] * r)
if 0 <= nx < N and 0 <= ny < N:
desert[nx][ny] += sand
else:
init['res'] += sand
spreads += sand
N = int(input())
desert = [list(map(int, input().split())) for _ in range(N)]
init = {'sx': N//2, 'sy': N//2, 'res': 0}
left = [(-2, 0, 0.02), (2, 0, 0.02), (-1, -1, 0.1), (-1, 0, 0.07), (-1, 1, 0.01), (1, -1, 0.1), (1, 0, 0.07), (1, 1, 0.01), (0, -2, 0.05), (0, -1, 0)]
right = [(x, -y, z) for x, y, z in left]
down = [(-y, x, z) for x, y, z in left]
up = [(-x, y, z) for x, y, z in down]
rate = {'left': left, 'right': right, 'down': down, 'up': up}
for i in range(N):
if i % 2 == 0:
move(i, 0, -1, 'left')
move(i, 1, 0, 'down')
else:
move(i, 0, 1, 'right')
move(i, -1, 0, 'up')
print(init['res'])