출처 | https://www.acmicpc.net/problem/14889
import sys
n = int(sys.stdin.readline())
graph = [ list(map(int, sys.stdin.readline().split())) for _ in range(n) ]
visit = [ False for _ in range(n) ] #1-1차원으로 방문 리스트 생성
min_value = sys.maxsize #2- 최소값을 갱신할 변수 생성
def backTracking(depth, idx): #3-깊이를 나타내는 변수와 인덱스 변수를 인자로 받아줌
global min_value
if depth == n // 2: #4-n은 늘 짝수로 주어진다고 했다. 주어진 수의 절반이 한 팀으로 선택되었을때 가지치기 시작
power1, power2 = 0, 0
for i in range(n):
for j in range(n):
if visit[i] and visit[j]: #5-True의 값을 가지는 팀을 스타트팀이라 할때 스타트 팀의 능력치를 모두 power1에 더하고
power1 += graph[i][j]
elif not visit[i] and not visit[j]: #6-나머지 절반 False의 값을 가지는 팀을 링크팀이라 할때 링크 팀의 능력치를 모두 power2에 더한다.
power2 += graph[i][j]
min_value = min(min_value, abs(power1-power2)) #7- 2중 for문이 끝났을때 그 둘의 차이의 절댓값이 변수보다 작으면 변수 갱신
return
for i in range(idx, n): #8-#4의 조건에 걸리기 전(스타트 팀을 완성하지 못했을때) 백트래킹 실시
if not visit[i]:
visit[i] = True
backTracking(depth+1, i+1) #9-깊이 +1, 같은 번호 중복을 막기위한 idx+1로 재귀호출
visit[i] = False
backTracking(0, 0)
print(min_value)
import sys
test = sys.maxsize
print(test)
list1 = range(test)
print(len(list1))
"""
<결과>
2147483647
2147483647
"""
python3이상에선 int형을 초과할 경우 자동으로 long으로 변환되기 때문에 다음과 같은 연산도 가능하다.
# 최대 정수값 초과시 long으로 자동 변환
test += 1
print(test)
"""
<결과>
2147483648
"""