본문 바로가기

카테고리 없음

4837. [파이썬 S/W 문제해결 기본] 2일차 - 부분집합의 합

 

#부분집합의 합 문제
# 부분집합 중 그 집합의 원소를 모두 더한 값이 0이 되는 경우가 있는지 알아내는 문제

#집합의 원소가 n개일때 공집합 포함 부분집합의 수는 2의 n개

#부분 집합 문제 알고리즘1
# loop를 이용하여 확인하고, 부분 집합을 생성하는 방법

# bit = [0,0,0,0]
# for i in range(2):
#     bit[0] = i   # 0번째 원소를 보일까 말까 
#     for j in range(2):
#         bit[1] = j #1번째 원소
#         for k in range(2): 
#             bit[2] = k #2번째 원소
#             for l in range(2):
#                 bit[3] = l
#                 print(bit)
                
# #보다 간결하게 부분집합 생성하는 방법
# #부분 집합 문제 알고리즘2

# arr = [3,6,7,1,5,4]
# n = len(arr)

# for i in range(1<<n):
#     for j in range(n):
#         if i&(1<<j): # i 에서 j 번째 비트가 1인지 아닌지를 리턴
#             print(arr[j], end=',')
#     print()
    
# i와 j를 비트라고 생각하고 봐주세요
# 1<< j를 하면 1이 오른쪽에서부터 j번 밀려요
# 근데 그걸 i라는 값을 지닌 비트랑 비교했을 때 i값에서 오른쪽으로부터 j번째 위치한 비트가 1이면 값이 ㅇ, 1리턴 true
# 아니라면 0을 리턴 false 

 

 

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.


1부터 12까지의 숫자를 원소로 가진 집합 A가 있다. 집합 A의 부분 집합 중 N개의 원소를 갖고 있고, 원소의 합이 K인 부분집합의 개수를 출력하는 프로그램을 작성하시오.

해당하는 부분집합이 없는 경우 0을 출력한다. 모든 부분 집합을 만들어 답을 찾아도 된다.

 

예를 들어 N = 3, K = 6 경우, 부분집합은 { 1, 2, 3 } 경우 1가지가 존재한다.

 
 

[입력]
 

첫 줄에 테스트 케이스 개수 T가 주어진다.  ( 1 ≤ T ≤ 50 )
 

테스트 케이스 별로 부분집합 원소의 수 N과 부분 집합의 합 K가 여백을 두고 주어진다. ( 1 ≤ N ≤ 12, 1 ≤ K ≤ 100 )

 

[출력]
 

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.


T = int(input())

for test_case in range(1,T+1):
    N,K = map(int,input().split())
   
    arr = [i for i in range(1,13)]
    count=0
    for i in range(1<<12):
        subset=[]
        for j in range(12):
            if i&(1<<j):
                subset.append(arr[j])
            print(subset)
        if(len(subset)==N and sum(subset)==K):
            count+=1
    print(f"#{test_case} {count}")