14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net
<내 코드>
from itertools import combinations
N = int(input())
S = list(list(map(int, input().split())) for _ in range(N))
comb = combinations(range(N), N//2) # 0 ~ N-1을 N/2 만큼 씩 조합
ans = float('inf') # inf는 어떤 숫자와 비교해도 무조건 크다고 판정
# -inf는 어떤 수보다 무조건 작다
for c in comb:
start_team = list(c)
link_team = list(set(range(N)) - set(c)) # 차집합 후 리스트화
start_ability, link_ability = 0, 0
for i in range(N//2 - 1):
for j in range(i+1, N//2):
start_ability += S[start_team[i]][start_team[j]
] + S[start_team[j]][start_team[i]]
link_ability += S[link_team[i]][link_team[j]] + \
S[link_team[j]][link_team[i]]
ans = min(ans, abs(start_ability - link_ability))
print(ans)
이번 문제는 백트래킹 문제지만 브루트포스로 풀었다. 다른 사람의 풀이를 참조하면서 새로운 개념들을 몇 가지 알게 됐다. 집합을 이용해 팀을 나누는 방법을 사용했다.
inf - 어떤 숫자와 비교해도 무조건 크다고 판정되는 파이썬 기능
-inf - 어떤 숫자와 비교해도 무조건 작다
반응형
'알고리즘 문제풀기 > 백준 - Python' 카테고리의 다른 글
[백준 1992] 쿼드트리 - Python (분할정복, 재귀) (0) | 2020.11.24 |
---|---|
[백준 2630] 색종이 만들기 - Python (분할정복, 재귀) (0) | 2020.11.24 |
[백준 14888] 연산자 끼워넣기 - Python (백트래킹, DFS, 브루트포스) (0) | 2020.10.27 |
[백준 15652] N과 M (4) - Python (백트래킹, DFS) (0) | 2020.10.27 |
[백준 15651] N과 M (3) - Python (백트래킹, DFS) (0) | 2020.10.26 |