Study/SWEA

5188. [파이썬 S/W 문제해결 구현] 2일차 - 최소합

줴림 2025. 4. 21. 22:54

이번 문제는  맨 왼쪽 위에서 맨 오른쪽 아래까지 이동할 때의 숫자 합계의 최솟값을 구하는 문제이다.

T = int(input())

for test_case in range(1, T+1):
    N = int(input())
    arr = [list(map(int, input().split())) for _ in range(N)]
    min_sum = float('inf')
    
    def dfs(x, y, total):
        global min_sum
        if total >= min_sum:     # 이미 최소합보다 크면 가지치기
            return
        # 도착지점에 도달했을 때
        if x == N-1 and y == N-1:
            min_sum = min(min_sum, total)
            return
        
        for dx, dy in [(1, 0), (0, 1)]:
            nx, ny = x + dx, y + dy
            if 0 <= nx < N and 0 <= ny < N:
                dfs(nx, ny, total+arr[nx][ny])
    
    dfs(0, 0, arr[0][0])
            
    print(f"#{test_case} {min_sum}")

난 DFS로 풀려고 했는데 중간부터 잘 안 돼서 인터넷 검색해서 풀었다... 분발하자...

 

+) 다음 날 다시 풀었을 때 풀이: