Algorithm/SW Expert Academy

[Python] 4881. 배열 최소합

느낌표 공장장 2021. 9. 21. 23:57

 

# 배열 선택 함수 (진행할 행, 이전까지의 선택 숫자들의 합)
def select(y, temp_sum):
    global min_sum
    
    # 행의 맨 마지막까지 갔을 경우 (더이상 갈 곳 없으면)
    if y == n:
        # 만약 여태 더한 값이 min_sum에 저장되어 있는 값보다 작다면 갱신하고 돌아가기
        if temp_sum < min_sum:
            min_sum = temp_sum
        return

    # 여태 더한 값이 이미 min_sum에 저장되어있는 값보다 크다면 들어갈 필요 없어 돌아가
    if min_sum <= temp_sum:
        return

    for i in range(n):
        # 방문 안한 열 이라면 (겹치지 않는다면)
        if not visited[i]:
            visited[i] = 1  # 방문처리
            select(y+1, temp_sum + board[y][i]) # 다음 행으로 들어가기 그리고 숫자 더해주기
            visited[i] = 0  # 다음 사용을 위해 원상복구


tc = int(input())

for idx in range(1, tc+1):
    n = int(input())
    board = [list(map(int, input().split())) for _ in range(n)]

    # 방문처리 해줄 리스트
    visited = [0 for _ in range(n)]

    # 최소 합 담을 변수 (대각선의 합으로 넣어주었다.)
    min_sum = sum([board[i][i] for i in range(n)])

    # 함수 실행
    select(0, 0)

    print('#{} {}'.format(idx, min_sum))

 

 

 

 

'Algorithm > SW Expert Academy' 카테고리의 다른 글

[Python] 1226. 미로1  (0) 2021.09.23
[Python] 1225. 암호생성기  (0) 2021.09.23
[Python] 4880. 토너먼트 카드 게임  (0) 2021.09.21
[Python] 4875. 미로  (0) 2021.09.21
[Python] 4874. Forth  (0) 2021.09.21