알고리즘 공부

[삼성SW역량테스트] 마법사상어와 토네이도 (백준 20057)| Python3

유나쒸 2021. 10. 24. 00:21


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import sys
input=sys.stdin.readline
 
def get_move_order(n):
    orders=[] # (r,c,d)
    direction=[(0,-1),(1,0),(0,1),(-1,0)]
    r,c,d=n//2,n//2,0
    for i in range(1,n):
        for _ in range(2):
            for j in range(i):
                mr,mc=r+direction[d%4][0], c+direction[d%4][1]
                orders.append((mr,mc,d%4))
                r,c=mr,mc
            d+=1
    for i in range(n-2,-1,-1):
        orders.append((0,i,d%4))
    return orders
 
def move_tornado(r,c,moves):
    global out_of_map
    diff_sum=0
    for x,y,rate in moves[:-1]:
        mx,my=r+x,c+y
        diff=int(maps[r][c]*rate)
        if 0<=mx<and 0<=my<n: maps[mx][my]+=diff
        else: out_of_map+=diff
        diff_sum+=diff
    maps[r][c]-=diff_sum
    mx,my=r+moves[-1][0],c+moves[-1][1]
    if 0<=mx<and 0<=my<n: maps[mx][my]+=maps[r][c]
    else: out_of_map+=maps[r][c]
    maps[r][c]=0
 
left=[(-1,-1,0.1),(1,-1,0.1),(-1,0,0.07),(1,0,0.07),(-1,1,0.01),(1,1,0.01),(0,-2,0.05),
      (-2,0,0.02),(2,0,0.02),(0,-1,0)]
right=[(-1,-1,0.01),(1,-1,0.01),(-1,0,0.07),(1,0,0.07),(-1,1,0.1),(1,1,0.1),(0,2,0.05),
       (-2,0,0.02),(2,0,0.02),(0,1,0)]
down=[(-1,-1,0.01),(-1,1,0.01),(2,0,0.05),(1,-1,0.1),(1,1,0.1),(0,-2,0.02),
      (0,2,0.02),(0,-1,0.07),(0,1,0.07),(1,0,0)]
up=[(-1,-1,0.1),(-1,1,0.1),(-2,0,0.05),(1,-1,0.01),(1,1,0.01),(0,-2,0.02),
    (0,2,0.02),(0,-1,0.07),(0,1,0.07),(-1,0,0)]
moving=[left,down,right,up]
out_of_map=0
n=int(input())
maps=[list(map(int,input().split())) for _ in range(n)]
orders=get_move_order(n)
for r,c,d in orders:
    move_tornado(r,c, moving[d])
print(out_of_map)
cs