문제

인프런 문제 난이도: ⭐⭐

집합을 두 개의 부분집합으로 나누었을 때 두 부분집합의 원소의 합이 서로 같은 경우가 존재하면 “YES"를 출력하고, 그렇지 않으면 ”NO"를 출력하는 프로그램을 작성하세요.  
둘로 나뉘는 두 부분집합은 서로소 집합이며, 두 부분집합을 합하면 입력으로 주어진 원래의 집합이 되어 합니다.  
예를 들어 {1, 3, 5, 6, 7, 10}이 입력되면 {1, 3, 5, 7} = {6, 10} 으로 두 부분집합의 합이 16으로 같은 경우가 존재하는 것을 알 수 있다.

예시 1

Input: nums = [1, 3, 5, 6, 7, 10]
Output: YES

풀이 1: DFS


def main_f(list_1):
    N = len(list_1)
    list_1 = list_1
    tot = sum(list_1)
    half_tot = tot//2
    
    if tot % 2 != 0:
        print("NO")
        return
    
    def DFS(i, sum):
        global switch
        if switch:
            return
        if sum == half_tot:
            print("YES")
            switch = 1
        elif sum < half_tot:
            if i == N:
                return
            DFS(i+1, sum + list_1[i])
            DFS(i+1, sum)
        else:
            return
    
    DFS(0, 0)
    if switch == 0:
        print("NO")

switch = 0
nums = [1, 3, 5, 6, 7, 10]
main_f(nums)

Tags:

Categories:

Updated: