-
[백준] 20057 - 마법사 상어와 토네이도 (파이썬)알고리즘/백준 2021. 10. 8. 16:07
n = int(input()) array = [] for _ in range(n): array.append(list(map(int,input().split()))) x = n//2 y = n//2 idx = 1 dx = [-1,0,1,0] dy = [0,1,0,-1] total = [0] def front(a,b,d): nx = a + dx[d] ny = b + dy[d] sm = array[nx][ny] - 2*int(array[nx][ny]*0.01) - 2*int(array[nx][ny]*0.02)- 2*int(array[nx][ny]*0.07)-2*int(array[nx][ny]*0.1)-int(array[nx][ny]*0.05) if d == 1 or d == 3: for i in range(0,3,2): if 0<=a+dx[i]<n and 0<=b+dy[i]<n: array[a+dx[i]][b+dy[i]] += int(array[nx][ny]*0.01) else: total[0] += int(array[nx][ny]*0.01) if 0<=nx+dx[i]<n and 0<=ny+dy[i]<n: array[nx+dx[i]][ny+dy[i]] += int(array[nx][ny]*0.07) else: total[0] += int(array[nx][ny]*0.07) if 0<=nx+2*dx[i]<n and 0<=ny+2*dy[i]<n: array[nx+2*dx[i]][ny+2*dy[i]] += int(array[nx][ny]*0.02) else: total[0] += int(array[nx][ny]*0.02) if 0<=nx+dx[d]+dx[i]<n and 0<=ny+dy[d]+dy[i]<n: array[nx+dx[d]+dx[i]][ny+dy[d]+dy[i]] += int(array[nx][ny]*0.1) else: total[0] += int(array[nx][ny]*0.1) if 0<=nx+2*dx[d]<n and 0<=ny+2*dy[d]<n: array[nx+2*dx[d]][ny+2*dy[d]] += int(array[nx][ny]*0.05) else: total[0] += int(array[nx][ny]*0.05) if 0<=nx+dx[d]<n and 0<=ny+dy[d]<n: array[nx+dx[d]][ny+dy[d]] += sm else: total[0] += sm else: for i in range(1,4,2): if 0<=a+dx[i]<n and 0<=b+dy[i]<n: array[a+dx[i]][b+dy[i]] += int(array[nx][ny]*0.01) else: total[0] += int(array[nx][ny]*0.01) if 0<=nx+dx[i]<n and 0<=ny+dy[i]<n: array[nx+dx[i]][ny+dy[i]] += int(array[nx][ny]*0.07) else: total[0] += int(array[nx][ny]*0.07) if 0<=nx+2*dx[i]<n and 0<=ny+2*dy[i]<n: array[nx+2*dx[i]][ny+2*dy[i]] += int(array[nx][ny]*0.02) else: total[0] += int(array[nx][ny]*0.02) if 0<=nx+dx[d]+dx[i]<n and 0<=ny+dy[d]+dy[i]<n: array[nx+dx[d]+dx[i]][ny+dy[d]+dy[i]] += int(array[nx][ny]*0.1) else: total[0] += int(array[nx][ny]*0.1) if 0<=nx+2*dx[d]<n and 0<=ny+2*dy[d]<n: array[nx+2*dx[d]][ny+2*dy[d]] += int(array[nx][ny]*0.05) else: total[0] += int(array[nx][ny]*0.05) if 0<=nx+dx[d]<n and 0<=ny+dy[d]<n: array[nx+dx[d]][ny+dy[d]] += sm else: total[0] += sm array[nx][ny] = 0 idx = 1 while True: for i in range(idx): if x==0 and y==0: break front(x,y,3) x = x+dx[3] y = y+dy[3] if x==0 and y==0: break for i in range(idx): front(x,y,2) x = x+dx[2] y = y+dy[2] idx += 1 for i in range(idx): front(x,y,1) x = x+dx[1] y = y+dy[1] for i in range(idx): front(x,y,0) x = x+dx[0] y = y+dy[0] idx += 1 print(total[0])
(왼, 아래) -> 길이 +1 -> (오른쪽, 위) -> 길이 +1 -> (왼,아래) ....
로 idx를 통해 구현해주었다. // front -> 한칸 전진할때 일어나는 일들을 담은 함수
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 10819 - 차이를 최대로 (파이썬) (0) 2021.10.20 [백준] 1759 - 암호 만들기 (파이썬) (0) 2021.10.20 [백준] 20056 - 마법사 상어와 파이어볼 (파이썬) (0) 2021.10.04 [백준] 20055 - 컨베이어 벨트 위의 로봇 (파이썬) (0) 2021.09.30 [백준] 1915 - 가장 큰 정사각형 (파이썬) (0) 2021.09.29