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

2022. 5. 3. 14:062022/BaekJoon_삼성 SW 역량 테스트 기출

import math

def ratioList(x, y, idx):
    #서
    if idx == 0:
        ratioList = [[[x, y-2], 0.05], 
                 [[x+1, y-1], 0.1], [[x-1, y-1], 0.1], 
                 [[x+1, y], 0.07], [[x-1, y], 0.07],
                 [[x+1, y+1], 0.01], [[x-1, y+1], 0.01], 
                 [[x+2, y], 0.02], [[x-2, y], 0.02]]
    #남
    elif idx == 1:
        ratioList = [[[x+2, y], 0.05], 
                 [[x+1, y+1], 0.1], [[x+1, y-1], 0.1], 
                 [[x, y+1], 0.07], [[x, y-1], 0.07],
                 [[x-1, y+1], 0.01], [[x-1, y-1], 0.01], 
                 [[x, y+2], 0.02], [[x, y-2], 0.02]]
    #동
    elif idx == 2:
        ratioList = [[[x, y+2], 0.05], 
                 [[x+1, y+1], 0.1], [[x-1, y+1], 0.1], 
                 [[x+1, y], 0.07], [[x-1, y], 0.07],
                 [[x+1, y-1], 0.01], [[x-1, y-1], 0.01], 
                 [[x+2, y], 0.02], [[x-2, y], 0.02]]
    else:
        ratioList = [[[x-2, y], 0.05], 
                 [[x-1, y+1], 0.1], [[x-1, y-1], 0.1], 
                 [[x, y+1], 0.07], [[x, y-1], 0.07],
                 [[x+1, y+1], 0.01], [[x+1, y-1], 0.01], 
                 [[x, y+2], 0.02], [[x, y-2], 0.02]]

    return ratioList

#이동 한 후 graph에 있는 모래의 양 확인
def tornado(graph, x, y, idx):
    global remainSend
    ratioL = ratioList(x, y, idx)
    ratioSend = 0
    for ratio in ratioL:
        tx = ratio[0][0]
        ty = ratio[0][1]
        #범위를 벗어나는 모래는 카운팅
        if tx<=0 or tx>N or ty<=0 or ty>N:
            remainSend += int(graph[x][y]*ratio[1])
            ratioSend += int(graph[x][y]*ratio[1])
        #연산결과가 1이상이면 정수 양만큼 다음 칸으로 모래 이동
        elif int(graph[x][y]*ratio[1])>0:
            graph[tx][ty] += int(graph[x][y]*ratio[1])
            ratioSend += int(graph[x][y]*ratio[1])
            
    if idx == 0:
        a = x; b = y-1
    elif idx == 1:
        a = x+1; b=y
    elif idx == 2:
        a=x; b=y+1
    else:
        a=x-1; b=y
        
    send = graph[x][y]-ratioSend
    if (0<a<=N) and (0<b<=N):
        graph[a][b] += send
    else:
        remainSend+=send
        
    graph[x][y] = 0
    return graph
    
# 서 -> 남 -> 동 -> 북
dx = [0, 1, 0, -1]
dy = [-1, 0, 1, 0]
idx = -1
remainSend = 0

N = int(input())
graph = [[0]*(N+1)]
for _ in range(N):
    graph.append([0] + list(map(int, input().split())))
    
x = math.ceil(float(N)/float(2)); y = x
curLoc = graph[x][y]
    
cnt = 0
for i in range(1, N):
    cnt += 1
    if i == N-1:
        for j in range(3):
            idx = (idx+1)%4
            for k in range(i):
                x += dx[idx]; y += dy[idx]
                graph = tornado(graph, x, y, idx)

    else:
        for j in range(2):
            idx = (idx+1)%4
            for k in range(i):
                x += dx[idx]; y += dy[idx]
                graph = tornado(graph, x, y, idx)
    
print(remainSend)

'2022 > BaekJoon_삼성 SW 역량 테스트 기출' 카테고리의 다른 글

14891 - 톱니바퀴  (0) 2022.05.04
20058 - 마법사 상어와 파이어스톰  (0) 2022.05.03
17822 - 원판 돌리기  (0) 2022.05.03
17144 - 미세먼지 안녕!  (0) 2022.05.03
16236 - 아기상어*  (0) 2022.05.03