코팅테스트/백준 문제 모음

SWEA 4012번 파이썬 문제풀이(요리사)

유지광이 2022. 3. 18. 17:57
728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeUtVakTMDFAVH 

 

SW Expert Academy

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

swexpertacademy.com

 


무슨 문제를 이렇게 이해하기 어렵게 내는지....

 

우선 문제풀이는 N개 중에 조합으로 N // 2개씩 뽑으면 된다. 예를들어 4개라면 0~3 중 (0,1) | (2,3) , (0,2) | (1,3) 이런식으로 생각하면 되는데 문제는 N이 6개일 때다. 3개를 뽑았다면 (0,1,2) | (3,4,5) 를 뽑았다면 여기서 다시 2개씩 조합으로 뽑아서 더해야하는 건지 아니면 2개만 사용하는건지.. 정답은 3개중에 다시 2개씩 조합으로 뽑아 모든 경우를 더해주는 것이었다. 나머지 구현은 쉽게 할 수 있다. 

 

import sys

sys.stdin = open('input.txt', 'r')

T = int(input())


def dfs(depth, start):
    global min_

    # N // 2 개를 방문처리했다면
    if depth == N // 2:

        A, B = 0, 0
        # 전체를 검사하면서 1처리가 된것과 되지 않은 것을 나누어서 각각 A,B에 2개씩 더해준다.
        for a in range(N):
            for b in range(N):
                if a >= b:  # 만약 a >=b 라면 검색할 필요가 없기 때문에 continue
                    continue
                if visited[a] and visited[b]:
                    A += (food[a][b] + food[b][a])
                elif not visited[a] and not visited[b]:
                    B += (food[a][b] + food[b][a])

        if abs(A - B) < min_:
            min_ = abs(A - B)

        return

    for i in range(start, N):
        visited[i] = True  # i를 방문처리
        dfs(depth + 1, i + 1)  # i + 1부터 재귀를 돈다.
        visited[i] = False  # 돌고 난 후 다시 방문 False처리


for tc in range(1, T + 1):
    N = int(input())
    food = [list(map(int, input().split())) for _ in range(N)]
    visited = [False] * N

    min_ = 1 << 60

    dfs(0, 0)

    print(f'#{tc} {min_}')
728x90