가운데 칸부터 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)
'IT > coding study' 카테고리의 다른 글
[acmicpc] 21609. 상어 중학교(python) (0) | 2023.02.12 |
---|---|
[acmicpc] 6593. 상범 빌딩(python) (0) | 2023.02.07 |
[acmicpc] 10816. 숫자 카드 2(python) (0) | 2022.11.11 |
[acmicpc] 2206. 벽 부수고 이동하기(python) (0) | 2022.10.10 |
[acmicpc] 21921. 블로그 (python) (0) | 2022.10.04 |