IT/coding study

[acmicpc] 20057. 마법사 상어와 토네이도(python)

seyeonHello 2023. 2. 5. 18:37

가운데 칸부터 2쌍씩 짝을 지어 증가된다. -> 2쌍씩 : for문 range 2까지 설정

import sys
input=sys.stdin.readline

N=int(input())
arr=[list(map(int,input().split())) for _ in range(N)]

src_r,src_c=N//2,N//2
dirs=[(0,-1),(1,0),(0,1),(-1,0)]
num=1
idx=0

def rotate_90(rate):
    return list(reversed(list(zip(*rate))))
rate=[[0,0,0.02,0,0],
      [0,0.1,0.07,0.01,0],
      [0.05,0,0,0,0],
      [0,0.1,0.07,0.01,0],
      [0,0,0.02,0,0]]
rate2=rotate_90(rate)
rate3=rotate_90(rate2)
rate4=rotate_90(rate3)
rates=[rate,rate2,rate3,rate4]
answer=0
flag=True
while True:
    for _ in range(2):
        for i in range(1,num+1):
            src_r += dirs[idx][0]
            src_c += dirs[idx][1]
            if 0<=src_r<N and 0<=src_c<N:
                amount = arr[src_r][src_c]
                res=amount
                for r in range(5):
                    for c in range(5):
                        now_sand=int(amount * rates[idx][r][c])
                        res-=now_sand
                        if 0 <= src_r - 2 + r < N and 0 <= src_c - 2 + c < N: #비율이 범위안이면
                            arr[src_r - 2 + r][src_c - 2 + c] += now_sand
                        else:
                            answer += now_sand
                arr[src_r][src_c]=0
                if 0<=src_r+dirs[idx][0]<N and 0<=src_c+dirs[idx][1]<N:
                    arr[src_r+dirs[idx][0]][src_c+dirs[idx][1]] += res
                else:
                    answer+=res
            if src_r < 0 or src_c < 0 or src_c >= N or src_r >= N:
                flag=False
                break
        idx = (idx + 1) % 4
    num+=1
    if not flag:
        break
print(answer)

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

 

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

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

www.acmicpc.net