728x90
반응형
1. 문제 설명
2. 풀이과정
해당 문제는 모든 인원을 정확하게 두 팀으로 나누고 나눈 두 팀의 능력치를 계산하여 그 차이의 최솟값을 구하는 문제이다.
팀을 정확하게 두 팀으로 나누어야 하고, 나눈 두 팀에 대해 각 능력치를 구한 뒤, 두 팀의 능력치의 차이를 계산해야 한다. 계산한 능력치의 차이 중 최솟값을 구하면 된다.
하여 제일 앞사람부터 첫 번째 팀으로 이동하며 팀을 나눈다.
만약 첫 번째 팀의 인원이 전체 인원의 절반이 되면, 남은 사람들은 모두 두 번째 팀이 된다.
두 팀으로 나누어졌으면 각 팀원들이 같은 팀이 되었을 때 더해지는 능력치를 계산하여 각 팀별 최종 능력치를 구한다.
구한 팀별 능력치의 차이를 계산해 현재 최솟값과 비교하여 더 작은 값을 저장한다.
해당 경우에 따른 계산이 끝나면 첫 번째 팀에 넣은 인원을 제거하여 팀 구성을 새롭게 한다. (백트랙킹 활용)
가능한 모든 팀 구성별 능력치의 차이를 확인해 최종 최솟값을 구한다.
- sys.stdin.readline() 함수를 사용하기 위해 sys 모듈을 불러온다. import sys
- 인원수를 입력받는다. N = int(sys.stdin.readline())
- 각 사람별 팀이 되었을 때 팀에 더해지는 능력치를 저장할 리스트를 생성한다. S = list()
- 인원수만큼 반복하며 for _ in range(N)
- 능력치 표의 값을 입력받아 리스트로 추가한다. S.append(list(map(int, sys.stdin.readline().split())))
- 나누어진 두 팀의 최종 능력치를 구할 함수를 정의한다. def colPower()
- 첫 번째 팀의 능력치를 저장할 변수를 생성하고 초기화한다. power1 = 0
- 첫 번째 팀의 팀원을 한 명씩 두 명 불러 for i in team1: for j in team1
- 두 팀원으로 인해 더해지는 능력치를 최종 팀 능력치에 더한다. power1 += S[i][j]
- 두 번째 팀의 능력치를 저장할 변수를 생성하고 초기화한다. power2 = 0
- 두 번째 팀의 팀원을 한 명씩 두 명 불러 for i in team2: for j in team2
- 두 팀원으로 인해 더해지는 능력치를 최종 팀 능력치에 더한다. power2 += S[i][j]
- 두 팀의 최종 능력치의 차이를 반환한다. return abs(power1 - power2)
- 두 팀으로 나누고 최종 능력치 차이 중 최솟값을 구할 함수를 정의한다. def solution(n)
- 두 팀의 최종 능력치의 차이 중 최솟값을 저장할 변수를 외부에서 불러온다. global MIN
- 만약 첫 번째 팀의 인원수가 전체 인원수의 절반이 되면 if (len(team1) == N // 2)
- 두 번째 팀을 저장할 리스트를 초기화한다. team2.clear()
- 모든 사람을 한 명씩 불러 for i in range(N)
- 만약 해당 사람이 첫 번째 팀에 없다면 if (i not in team1)
- 두 번째 팀에 추가한다. team2.append(i)
- 정확히 두 팀으로 나눈 후, 각 팀의 최종 능력치의 차이를 구해 현재 최솟값과 비교하여 최솟값을 저장한다. MIN = min(MIN, calPower())
- 현재 경우에 따른 최솟값을 비교하였으므로 종료한다. return
- 반면 아직 팀이 나누어지지 않았다면 현재 남은 인원 중 앞사람부터 for i in range(n, N)
- 첫 번째 팀으로 이동한다. team1.append(i)
- 남은 다음 사람을 팀으로 나누기 위해 다음 사람을 인수로 주어 함수를 호출한다. solution(i + 1)
- 해당 경우에 따른 결과를 모두 구했다면 현재 경우에서 첫 번째 팀으로 넣은 사람을 제거한다. team1.pop()
- 각 팀의 인원을 저장할 리스트를 생성한다. team1 = list() team2 = list()
- 두 팀의 최종 능력치의 차이 최솟값을 저장할 변수를 생성하고 가능한 제일 큰 값인 100을 저장한다. MIN = 100
- 제일 앞사람부터 팀을 나누기 위해 0을 인수로 하여 팀을 나눌 함수를 호출한다. solution(0)
- 가능한 모든 경우에 대해 최종 능력치의 차이 중 최솟값을 출력한다. print(MIN)
반응형
3. 소스코드
import sys
N = int(sys.stdin.readline())
S = list()
for i in range(N):
S.append(list(map(int, sys.stdin.readline().split())))
def calPower():
power1 = 0
for i in team1:
for j in team1:
power1 += S[i][j]
power2 = 0
for i in team2:
for j in team2:
power2 += S[i][j]
return abs(power1 - power2)
def solution(n):
global MIN
if (len(team1) == N // 2):
team2.clear()
for i in range(N):
if (i not in team1):
team2.append(i)
MIN = min(MIN, calPower())
return
for i in range(n, N):
team1.append(i)
solution(i + 1)
team1.pop()
team1 = list()
team2 = list()
MIN = 100
solution(0)
print(MIN)
728x90
반응형
'백준' 카테고리의 다른 글
[백준] 2565번 : 전깃줄 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.12.28 |
---|---|
[백준] 11054번 : 가장 긴 바이토닉 부분 수열 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.12.27 |
[백준] 1904번 : 01타일 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.12.26 |
[백준] 9184번 : 신나는 함수 실행 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.12.24 |
[백준] 24416번 : 알고리즘 수업 - 피보나치 수 1 - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.12.22 |
[백준] 14888번 : 연산자 끼워넣기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.12.21 |
[백준] 2580번 : 스도쿠 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.12.20 |
[백준] 9663번 : N-Queen - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.12.19 |