가장 높은 탑을 구하는 프로그램 만들자
첫 번째 줄에는 자연수 N(1<=N<=20)이 주어진다.
두 번째 줄부터 계곡의 N*N 격자의 돌다리 높이(10보다 작은 자연수) 정보가 주어진다.
첫 번째 줄에 (1, 1)출발지에서 (N, N)도착지로 가기 위한 최소 에너지를 출력한다.
- DFS 생각해서 x+1 과 y+1 하여 sum에 이차원 배열 값을 저장하였으나, 답은 맞지만 시간 limit,, 어떤 조건을 걸어줘야 할지 알아내지 못했다.
 
import sys
def input():
    return sys.stdin.readline().rstrip()
def DFS(x, y, sum):
    global N
    if x > N:
        return
    elif y > N:
        return
    elif x== N and y == N:
        res.append(sum)
        return
    else:
        DFS(x+1,y,sum+arr[x+1][y])       
        DFS(x,y+1,sum+arr[x][y+1])
      
if __name__ == "__main__":
    N = int(input())
    arr = [0 for _ in range(N)]
    res = []
    for i in range(N):
        arr[i] = list(map(int,input().split()))
        arr[i].insert(0,0)
        arr[i].append(0)
    arr.insert(0,[0]*(N+2))
    arr.append([0]*(N+2))
    DFS(1,1,arr[1][1])
    print(min(res))
  
- 2차원 리스트를 하나 더 만들어서 dy 배열에 값을 저장한다.
 - 도착점을 기준으로 어떻게 해야 최소로 올 수 있는지를 누적한다.
 - 이를 위해 앞전에 0 행과 0열은 가질 수 있는 최솟값이 1개씩 이므로, 초기화 해준다.
 
import sys
sys.stdin=open("input.txt","rt")
def input():
    return sys.stdin.readline().rstrip()
if __name__ == "__main__":
    N = int(input())
    arr = [list(map(int,input().split())) for _ in range(N)]
    dy = [[0]*N for _ in range(N)]
    dy[0][0] = arr[0][0]
    #0 행과 0열은 가질 수 있는 최솟값이 1개씩 이므로, 초기화 해준다.
    for i in range(N):
        dy[0][i] = dy[0][i-1]+arr[0][i]
        dy[i][0] = dy[i-1][0]+arr[i][0]
    for i in range(1, N):
        for j in range(1,N):
            dy[i][j] = min(dy[i-1][j],dy[i][j-1])+arr[i][j]
    print(dy[N-1][N-1])
아 튜플 인덱스 0 으로 정렬할때는 굳이 lambda 안쓰고 sort 해도 되는구나
