파이썬알고리즘/SW Expert Academy
[ SW Expert Academy / 4837 ] 부분집합의 합
투굠이
2022. 2. 10. 00:37
1. 문제 이해
입력값:
N (1 이상 12 이하)
K (1 이상 100 이하)
유의해야 할 점:
1. 1 부터 12까지의 숫자를 원소로 하는 집합 A
N : 부분집합의 원소 수
K : 부분집합 원소의 합
출력 값:
제시된 원소수와 원소 합에 대응하는 부분집합의 수
2. 문제 풀이 법
사용한 방법: 부분집합 구하기
temp_sum - 부분집합 합
temp_cnt - 부분집합 원소 수
부분집합 합과 원소 수 구하는데,
만약 문제에서 제시한 합 또는 원소수를 초과 할 경우 break를 통해 해당 부분집합은 skip 하였다.
3. 어려웠던 점
부분집합 코드
T = int(input())
for tc in range(1,T+1):
N, K = map(int,input().split())
result = 0 # 조건에 만족하는 부분집합의 수
for i in range(1<<12):
temp_cnt = 0 # 부분집합 원소 갯수
temp_sum = 0 # 부분집합 원소
for j in range(12):
if i & (1<<j): # j 번째 비트가 1이면
temp_sum += j+1 # 1 ~ 12
temp_cnt += 1
if temp_cnt > N or temp_sum > K:
break
if temp_cnt == N and temp_sum == K:
result += 1
print(f'#{tc} {result}')
4. 배운 점
부분집합
5. 메모
+) 부분집합
arr = [ 2 ,3 , 5, 68, 89, 8]
n = len(arr) # 원소 수
for i in range(1<<n) # arr 부분집합 수
for j in range(n) # 비트 비교 ( 원소 수 )
if i % (1<<j) # i의 j 번째 비트가 1이면 j번쨰 원소 출력 (부분집합에들어가는 원소 채택)
# 코드 적용