ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 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 -> 한칸 전진할때 일어나는 일들을 담은 함수

    댓글

Designed by Tistory.