CS/Algorithm 문제

[BaekJoon] 백준 20057번 마법사 상어와 토네이도

[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
반응형