[BOJ] 20057 마법사 상어와 토네이도(Python) - 삼성SW역량테스트 기출

Soomin Kim·2021년 10월 21일
0

백준

목록 보기
3/9

BOJ 20057 마법사 상어와 토네이도

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

# BOJ 20057 마법사 상어와 토네이도[삼성 SW 역량 테스트 기출] 골드 3
import math
def find(dir, y, x):
    blowed = 0
    global anw
    y, x = y + dy[dir], x + dx[dir]
    original = arr[y][x]
    for j in range(10):
        ny, nx = y + dusty[dir][j], x + dustx[dir][j]
        # 경계 밖으로 벗어난 모래 anw에 추가
        if ny < 0 or ny >= N or nx < 0 or nx >= N:
            if j == 9:
                anw += (original - blowed)
            else:
                anw += math.floor(arr[y][x] * blow[j])
                blowed += math.floor(arr[y][x] * blow[j])
            continue
        # 경계 안으로 들어오면 해당 위치에 흩날린 만큼 모래 더해주고, 마지막에 남은 모래들 알파 칸으로 보내기 위해 지금까지 흩날린 모래도 계산
        arr[ny][nx] += math.floor(arr[y][x] * blow[j])
        blowed += math.floor(arr[y][x] * blow[j])
        # 알파 칸으로 보내기
        if j == 9:
            arr[ny][nx] += (original - blowed)
            arr[y][x] = 0
    return y, x
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
dy = [0, 1, 0, -1]
dx = [-1, 0, 1, 0]
# 흩날리는 모래의 동서남북 이동 인덱스
dusty = [[0, -1, 1, -2, -1, 1, 2, -1, 1, 0], [2, 1, 1, 0, 0, 0, 0, -1, -1, 1], [0, -1, 1, -2, -1, 1, 2, -1, 1, 0], [-2, -1, -1, 0, 0, 0, 0, 1, 1, -1]]
dustx = [[-2, -1, -1, 0, 0, 0, 0, 1, 1, -1], [0, -1, 1, -2, -1, 1, 2, -1, 1, 0], [2, 1, 1, 0, 0, 0, 0, -1, -1, 1], [0, -1, 1, -2, -1, 1, 2, -1, 1, 0]]
# 흩날리는 모래의 인덱스에 해당하는 비율
blow = [0.05, 0.1, 0.1, 0.02, 0.07, 0.07, 0.02, 0.01, 0.01, 0]
idx = 1
y, x = N//2, N//2
anw = 0
flag = False
while idx <= N:
    for i in range(idx):
        y,x = find(0, y, x)
        if y == 0 and x == 0: # 토네이도 끝
            flag = True
            break
    if flag:
        break
    for i in range(idx):
        # 남쪽으로 바람불기
        y, x = find(1, y, x)
    idx += 1
    for i in range(idx):
        # 동쪽으로 바람부기
        y, x= find(2, y, x)
    for i in range(idx):
        # 북쪽으로 바람불기
        y,x = find(3, y, x)
    idx += 1
print(anw)
profile
개발자지망생

0개의 댓글

관련 채용 정보