내 코드

import sys, math
sys.stdin = open("input.txt")
input = sys.stdin.readline

def solve(cnt, idx):
    global min_value, check
    if cnt == m:
        temp = list(all - set(team))
        sum_a = 0
        sum_b = 0
        for i in range(m - 1):
            for j in range(i + 1, m):
                sum_a += arr[team[i]][team[j]]
                sum_a += arr[team[j]][team[i]]
        for i in range(m - 1):
            for j in range(i + 1, m):
                sum_b += arr[temp[i]][temp[j]]
                sum_b += arr[temp[j]][temp[i]]

        value = abs(sum_a - sum_b)
        if min_value > value:
            min_value = value
        check += 1
        if check == end:
            print(min_value)
            exit()

        return

    for i in range(idx + 1, n):
        if not visited[i]:
            visited[i] = True
            team.append(i)
            solve(cnt + 1, i)
            visited[i] = False
            team.pop()

n = int(input())
m = int(n / 2)
arr = [list(map(int, input().split())) for _ in range(n)]
visited = [False] * n
team = []
all = set([i for i in range(n)])
end = math.factorial(n) // (math.factorial(m) ** 2)
min_value = math.inf
check = 0
solve(0, -1)

:star: 소름돋았던 코드

import sys
sys.stdin = open("input.txt")
input = sys.stdin.readline

def DFS(L, s, a):
    global res
    if L == N // 2:
        res = min(res, abs(s))
        return
    for i in range(a, N):
        DFS(L + 1, s - row[i] - col[i], i + 1)

N = int(input())
gra = [list(map(int, input().split())) for _ in range(N)]
row = [0] * N
col = [0] * N

tot = 0
for i in range(N):
    for j in range(N):
        row[i] += gra[i][j]
        col[j] += gra[i][j]
        tot += gra[i][j]
        
res = 2147000000
DFS(1, tot - row[0] - col[0], 1)
print(res)
# dddd04032님 풀이

:star:풀이

14889

진짜 자괴감을 많이 느끼면서 풀었던 문제다 ㅜㅜㅜㅜ

시간 초과문제가 해결이 안되어서 스트레스를 정말 많이 받았다.

어떤 팀을 방문 했으면 그 다음 팀부터 dfs를 돌아야하는데 멍청하게 0번 팀부터 다시 돌았다.

itertools를 쓰면 금방 풀렸겠지만 백트래킹을 연습하고 싶어서 사용하지 않았다.(덕분에 슬퍼짐 흑흑)

맞힌사람들 풀이를 보던 도중 소름돋는 풀이를 찾아서 같이 포스팅했다.

행 별로, 열 별로 합들을 구해 저정한 뒤 전체 합에서 팀에 포함시키고 싶은 번호의 팀의 행, 열의 합을 빼서 구하는 방식이다.

시간도 절반정도 줄일 수 있고 코드도 훨씬 간결하다.

정말 대단한 풀이당..!! dddd04032님 감사합니다 ㅠ

p.s

오늘 ICPC Sinchon Winter Algorithm Camp Contest Open 대회에 참가 했는데 4문제나 풀어서 기뻤지만

이문제 때문에 다시 기분이 다운되었다 ㅎㅎㅎ 더 열심히하자!!

댓글남기기