본문 바로가기
알고리즘 문제풀이/백준

백준 14889

by Hoseok 2023. 4. 1.
728x90
반응형

 

import itertools

n = int(input())
abilities = [list(map(int, input().split())) for _ in range(n)]

min_diff = float('inf')  # 능력치 차이의 최솟값
for team_a in itertools.combinations(range(n), n//2):
    team_b = list(set(range(n)) - set(team_a))  # team_a의 집합 차집합
    sum_a = sum(abilities[i][j] + abilities[j][i] for i, j in itertools.combinations(team_a, 2))
    sum_b = sum(abilities[i][j] + abilities[j][i] for i, j in itertools.combinations(team_b, 2))
    min_diff = min(min_diff, abs(sum_a - sum_b))

print(min_diff)

 

코드 리뷰

 

1. import itertools: itertools 모듈을 불러오기. 반복자(iterator)를 만드는 함수들을 포함하고 있다.

2. n = int(input()): 입력으로 플레이어의 수 n을 받기.

3. abilities = [list(map(int, input().split())) for _ in range(n)]: n명의 플레이어의 능력치 정보를 입력받아 이차원 리스트인 abilities에 저장.

4. min_diff = float('inf'): 초기값으로 min_diff 변수에 양의 무한대 값을 할당.

5. for team_a in itertools.combinations(range(n), n//2):: itertools.combinations() 함수를 사용하여 가능한 모든 팀 조합을 생성. range(n)에서 n//2개를 선택하는 조합을 생성하여 team_a에 할당.

6. team_b = list(set(range(n)) - set(team_a)): team_a의 요소를 제외한 나머지 요소들로 이루어진 리스트 team_b를 생성.

7. sum_a = sum(abilities[i][j] + abilities[j][i] for i, j in itertools.combinations(team_a, 2)): team_a의 각 플레이어 쌍의 능력치 합을 계산.

8. sum_b = sum(abilities[i][j] + abilities[j][i] for i, j in itertools.combinations(team_b, 2)): team_b의 각 플레이어 쌍의 능력치 합을 계산.

9. min_diff = min(min_diff, abs(sum_a - sum_b)): sum_a와 sum_b의 차이의 절댓값을 계산하여 min_diff와 비교하여 더 작은 값을 min_diff에 할당.

10. print(min_diff): 능력치 차이의 최솟값을 출력.

728x90
반응형

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

백준 2667  (0) 2023.04.05
백준 14888  (0) 2023.04.04
백준 2661  (0) 2023.04.01
백준 2798  (0) 2023.03.31
백준 10819  (0) 2023.03.31