여름의 서재

[SWEA] 5188_최소합 본문

알고리즘/SWEA

[SWEA] 5188_최소합

엉아_ 2021. 10. 5. 20:27
728x90

📕 문제

https://swexpertacademy.com/main/learn/course/lectureProblemViewer.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

💡 풀이법

1. dfs 함수를 만들어서 한칸씩 앞으로 전진해나간다.

2. 이 경우에는 맨 왼쪽 위에서 맨 오른쪽 아래칸으로 이동해야하고 중간에 가로막는 벽 같은 것도 없기 때문에 방향을 (0, 1), (1, 0) 으로만 설정한다.

(되돌아가지 않기 때문에 방문 처리 또한 필요없다)

3. 한칸씩 갈 수록 그 곳에 해당되는 숫자를 더해가며 재귀 dfs를 실행한다.

4. 만약 중간에 최소합(ans)보다 커지게 된다면 return한다. (가지치기)

5. 도착지에 도착하면 지금까지의 경로를 더한 s와 ans와 비교하여 s가 더 작으면 ans를 s로 바꿔준다.

 

dxy = [(0,1),(1,0)]
def dfs(x, y, s):
    global ans

    if s >= ans:  # 가지치기
        return

    if x == N-1 and y == N-1:  # 도착지에 도착한 경우
        if s < ans:
            ans = s
        return

    for dx, dy in dxy:
        nx, ny = x + dx, y + dy

        if nx > -1 and nx < N and ny > -1 and ny < N:
            dfs(nx, ny, s+matrix[nx][ny])

T = int(input())
for tc in range(1, T+1):
    N = int(input())
    matrix = [list(map(int, input().split())) for _ in range(N)]
    ans = 999999
    dfs(0, 0, matrix[0][0])
    print('#{} {}'.format(tc, ans))

'알고리즘 > SWEA' 카테고리의 다른 글

[SWEA] 5202_화물 도크  (0) 2021.10.05
[SWEA] 5189_전자카트  (0) 2021.10.05
[SWEA] 2806_N-Queen  (0) 2021.10.05
[SWEA] 1242_암호 코드 스캔  (0) 2021.09.30
[SWEA] 1240_단순 2진 암호코드  (0) 2021.09.30
Comments