[BOJ] 20057. 마법사 상어와 토네이도(🥇, 구현/시뮬레이션)

lemythe423·2023년 7월 13일
0

BOJ 문제풀이

목록 보기
6/133
post-thumbnail

📝 문제

✅ 격자의 가운데 칸부터 토네이도의 이동이 시작
✅ 모래가 이미 있는 칸으로 모래가 이동하면, 모래의 양은 더해진다
✅ 모래가 격자의 밖으로 이동할 수도 있다.
✅ 토네이도가 소멸되었을 때, 격자의 밖으로 나간 모래의 양

풀이

1️⃣ 격자의 가운데부터 한 칸씩 이동

가운데부터 회오리치듯 돌아서 (1,1)까지 나오게 된다. main 함수를 통해 구현했으며, 이동할 때마다 현재 칸의 모래의 양, 방향 등의 정보를 가지고 tornado 함수 실행

2️⃣ 토네이도

총 9칸에 대해서만 비율이 정해져 있고 남는 양은 알파(alpha)로 이동하게 된다. 격자 밖으로 벗어나는 모래들에 대해서는 ans_sand에 값을 저장

각 9칸에 대한 비율 정보가 dxy_lst에 담겨 있기 때문에 9번 반복문을 돌며 각각의 칸에 대해 처리

import sys
input = sys.stdin.readline

# 토네이도 시전
def tornado(arr, d, y, x):
    global total_sand, ans_sand
    dy, dx = dir[d%4]
    
    # 가로로 불 때와 세로로 불 때 처리
    if dx == 0:
        dxy_lst = (dy*2, 0), (dy, 1), (dy, -1), (dy*-1, 1), (dy*-1, -1), (0, -1), (0, 1), (0, -2), (0, 2)
    else:
        dxy_lst = (0, dx*2), (1, dx), (-1, dx), (1, dx*-1), (-1, dx*-1), (-1, 0), (1, 0), (-2, 0), (2, 0)
    
    NOW_SAND = alpha = arr[y][x]
    for i in range(9):
        dyy, dxx = dxy_lst[i]
        ny, nx = y+dyy, x+dxx
        tmp = int(NOW_SAND * RATIO[i])
        alpha -= tmp
        if -1<ny<N and -1<nx<N:
            arr[ny][nx] += tmp
        else: ans_sand += tmp

    if -1<y+dy<N and -1<x+dx<N:
        arr[y+dy][x+dx] += alpha
    else:
        ans_sand += alpha

    arr[y][x] = 0

def main():
    x = y = N//2
    u, v, d = 1, -1, 0
    while 1:
        if u == N:
            break
        for _ in range(u):
            x += v
            tornado(arr, d, y, x)
        v *= -1
        d += 1
        
        for _ in range(u):
            y += v
            tornado(arr, d, y, x)
        u += 1
        d += 1
    
    for _ in range(N-1):
        x -= 1
        tornado(arr, d, y, x)


N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
dir = (0, -1), (1, 0), (0, 1), (-1, 0)
RATIO = [0.05, 0.1, 0.1, 0.01, 0.01, 0.07, 0.07, 0.02, 0.02]
ans_sand = 0
main()
print(ans_sand)
profile
아무말이나하기

0개의 댓글