Algorithm/SWEA

SWEA #4881 배열 최소 합

개발자 뭄뭄 2022. 10. 3. 20:45
반응형

1. 완전 탐색의 기본

기억하자 for 문을 돌려야 될 수도? → 언제나 for 문에 대한 열린 생각!!

2. 기본적인 순열 & back-tracking 문제

  • 완전 탐색을 하면 ⇒ 시간초과 에러가 발생하였다!
  • back-tracking을 통해서 중간까지의 합이 현재의 최솟값보다 크면(앞으로는 더해야 하므로 가망이 없기 때문에) 리턴하는 방식으로 가지치기를 진행해주었다.

    → 이를 위해서 함수에 tmp 라는 인자를 가지고 다닌다.

이 테크닉을 이후에 유용하게 잘 써먹고 있다!

# 각 줄에 대해서 하나씩 선택하는 함수를 만든다
def select(i, k, tmp):
    global min_V
    if tmp > min_V:
        return
    
    if i == k:
        min_V = min(min_V, tmp)
        return
    else:
        for j in range(N):
            if not visited[j]:
                visited[j] = 1
                select(i+1, k, tmp+board[i][j])
                visited[j] = 0

T = int(input())
for tc in range(1, T+1):
    N = int(input())
    board = [list(map(int, input().split())) for _ in range(N)]
    min_V = 100
    visited = [0] * N
    select(0, N, 0)

    print(f"#{tc} {min_V}")

Uploaded by N2T

반응형