본문 바로가기
ALGORITHM/BAEKJOON

[BOJ/Python] 20057. 마법사 상어와 토네이도

by 안녕나는현서 2021. 10. 28.
728x90

📌 문제

https://www.acmicpc.net/problem/20057

 

20057번: 마법사 상어와 토네이도

마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을

www.acmicpc.net

 

📌 문제 접근 방법

  1. 우선 토네이도가 이동하는 부분 먼저 구현해줬다.
    1. 출발은 (N//2, N//2)에서 한다.
    2. 왼쪽 -> 아래 -> 오른쪽 -> 위 의 방향 순서대로 움직이기 때문에 이에 맞춰 델타 행렬을 만들어준다.
    3. 1칸씩 2번, 2칸씩 2번, 3칸씩 2번 ... 이런식으로 이동하길래 cnt를 2로 초기화 한 후
      2번 이동이 끝나면 값이 변경되도록 cnt를 2로 나눈 몫만큼 이동을 시켰다.
  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

댓글