728x90
https://swexpertacademy.com/main/learn/course/lectureProblemViewer.do
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
< 📝 문제 >
1부터 12까지의 숫자를 원소로 가진 집합 A가 있다. 집합 A의 부분 집합 중 N개의 원소를 갖고 있고, 원소의 합이 K인
부분집합의 개수를 출력하는 프로그램을 작성하시오.
해당하는 부분집합이 없는 경우 0을 출력한다. 모든 부분 집합을 만들어 답을 찾아도 된다.
예를 들어 N = 3, K = 6 경우, 부분집합은 { 1, 2, 3 } 경우 1가지가 존재한다.
< ❓ 생각 >
부분집합의 구하면서 원소의 합을 확인해보기
< 💻 코드 >
# T : 테스트 케이스 수
T = int(input())
for tc in range(1,T+1):
# N : 부분 집합 원소의 개수, K : 부분 집합 원소의 총 합
N, K = map(int,input().split())
# 1~ 12까지 숫자를 원소로 가진 집합
arr = [i for i in range(1,13)]
# 부분 집합의 원소의 개수가 N, 부분 집합 원소의 총 합이 K인 부분집합 개수
result = 0
# 모든 부분 집합 확인
for i in range(1<<12):
# 부분집합의 합
sum_sub = 0
# 부분집합
subset = []
for j in range(12):
if i & (1<<j):
# j번째 요소는 부분집합에 포함
sum_sub += arr[j]
subset.append(arr[j])
# 부분 집합의 원소의 개수가 N, 부분 집합 원소의 총 합이 K인 부분집합 개수 구하기
if len(subset) == N and sum_sub == K:
result += 1
print(f'#{tc} {result}')
< ❗ >
- & 연산자
- i&(1<<j) : i의 j번째 비트가 1인지 아닌지를 검사한다.
# (1<<j)는 j번째 비트만 1
if i&(1<<j):
print('i의 j번째 비트가 1')
else:
print('i의 j번째 비트가 0')
# i가 5라면, 101(2)이므로
# 1<<0 : True
# 1<<1 : False
# 1<<2 : True
728x90
반응형
'TIL - 프로그래밍 > Python 알고리즘' 카테고리의 다른 글
[SWEA] 4843. 특별한 정렬 - Python (0) | 2022.02.20 |
---|---|
[SWEA] 4839. 이진탐색 - Python (0) | 2022.02.20 |
[SWEA] 4836. 색칠하기- Python (0) | 2022.02.19 |
[SWEA] 1209. Sum - Python (0) | 2022.02.19 |
[SWEA] 1208. Flatten - Python (0) | 2022.02.19 |
댓글