현제의 현재이야기
[codetree] 2n개 중에 n개의 숫자를 적절하게 고르기 본문
| 문제
2n개의 숫자가 주어졌을 때, 이 숫자를 각각 n개씩 2개의 그룹으로 나눠 각 그룹 원소합의 차가 최소가 되도록 하는 프로그램을 작성해주세요.
n = int(input())
arr = list(map(int, input().split()))
one = []
result = float('inf')
def calculate():
global result
result = min(abs((sum(arr) - sum(one)) - sum(one)), result)
def make(curr_num, cnt):
if curr_num == 2 * n:
if cnt == n:
calculate()
return
one.append(arr[curr_num])
make(curr_num + 1, cnt + 1)
one.pop()
make(curr_num + 1, cnt)
return
make(0, 0)
print(result)
- 조합 만들기: curr_num이 최대 수라고 생각하고 cnt를 뽑은 개수라고 생각하면 된다.
- 즉 4개의 숫자 중에서 중복 없이 만들려면 curr_num이 최대 수 (여기서는 리스트 원소 개수)까지 도달했을 때, cnt(뽑은 개수)가 원하는 개수(여기서는 한 집합의 원소 개수)라면 calculate()를 실행한다.
- 밑에 알고리즘이 중요한데 pop() 해주고 cnt증가 없이 curr_num을 한번 더 조회하는 함수 호출이 필요하다.
| 최대 값, 최소 값
float('inf') # 최댓값
float('-inf') # 최소값
'algorithm' 카테고리의 다른 글
[programmers/그리디] 요격시스템, 단속카메라 (0) | 2023.07.13 |
---|---|
[백준/파이썬] 2003 - 수들의 합2 (1) | 2023.05.22 |
[codetree] 나이트, 안전지대(BFS, DFS) (0) | 2023.02.09 |
[codetree] 행복한 수열 (0) | 2023.02.05 |
[codetree] 떨어지는 1자 블록 (0) | 2023.02.04 |
Comments