14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net
[백준 14889번] 스타트와 링크
14889번: 스타트와 링크 예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다. www.acmicpc.net n = int(input()) visited = [False for _ in range(n)] data =
woohyun-king.tistory.com
from itertools import combinations
from itertools import permutations
n = int(input())
member = set([x for x in range(n)])
answer = float("inf")
area = [list(map(int,input().split())) for _ in range(n)]
case_list = list(combinations([x for x in range(n)], n//2))
case_list = case_list[:len(case_list)//2]
def calculate(numbers):
cases = permutations(numbers,2)
return sum([area[x][y] for x,y in cases])
for team_a in case_list:
team_b = [x for x in range(n) if x not in team_a]
diff = abs(calculate(team_a)-calculate(team_b))
if diff < answer:
answer = diff
print(answer)
본 문제는 이전에 포스팅했던 문제 중 하나인데, N명의 팀을 2개의 팀으로 나누었을 때 각 팀의 능력치의 차이를 최소화하는 문제이다.
이전에는 DFS를 사용하여 엄청 복잡하게 풀기도 했고 시간이 오래걸렸었는데, 이번에는 순열과 조합을 활용하여 경우의 수를 모두 구해주는 방식으로 간단하게 풀이할 수 있었다.
이전에 비해 완전 탐색(Brute Force)에 대한 감이 생긴 것 같아서 뿌듯했던 문제였다 :)
'Algorithm 💡 > BruteForce' 카테고리의 다른 글
[백준 1759번] 암호 만들기 (0) | 2024.01.15 |
---|---|
[백준 2529번] 부등호 (0) | 2024.01.15 |
[프로그래머스] 숫자의 표현 (1) | 2024.01.05 |
[백준 18808번] 스티커 붙이기 (1) | 2024.01.04 |
[백준 9079번] 동전 게임 (1) | 2024.01.04 |