현제의 현재이야기

[codetree] 2n개 중에 n개의 숫자를 적절하게 고르기 본문

algorithm

[codetree] 2n개 중에 n개의 숫자를 적절하게 고르기

현재의 현제 2023. 5. 9. 16:27

| 문제

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') # 최소값

 

Comments