반응형
4837. [파이썬 S/W 문제해결 기본] 2일차 - 부분집합의 합 D3
[파이썬 S/W 문제해결 기본] 2일차
2021.04.21 - [Algorithm] - SWEA 4836 색칠하기 (python)
2021.04.19 - [Algorithm] - SWEA 4837 부분집합의 합 (python)
2021.04.21 - [Algorithm] - SWEA 4839 이진탐색 (python)
2021.04.21 - [Algorithm] - SWEA 4843 특별한 정렬 (python)
문제
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())
def subset(info):
# N과 K 값을 임의로 설정한 리스트에서 하나씩 받아옴
N = info[0]
K = info[1]
# 1부터 12까지의 범위의 리스트 설정
A = [i for i in range(1,13)]
# 전체 초기값 설정
numbers = []
# 부분집합 구하는과정
for i in range(1<<12):
sub_numbers = []
for j in range(12):
if i&(1<<j):
# 부분집합 리스트를 생성
sub_numbers.append(A[j])
# 만약 부분집합 리스트의 길이가 원하는 N 이라면 전체 리스트에 삽입
if len(sub_numbers) == N:
numbers.append(sub_numbers)
# 카운트 초기화
count = 0
# 내장함수 sum 대신 total로 합을 구해서 원하는 값이 나오면 카운트
# 내장함수 사용시 위의 반복문에서 종료 가능
for i in range(len(numbers)):
total = 0
for j in numbers[i]:
total += j
if total == K:
count += 1
return count
for tc in range(1, T+1):
info = list(map(int, input().split()))
result = subset(info)
print("#{} {}".format(tc, result))
반응형
'Algorithm' 카테고리의 다른 글
SWEA 4828 min_max (python) (0) | 2021.04.19 |
---|---|
SWEA 5188 최소합 (python) (0) | 2021.04.19 |
SWEA 3752 가능한 시험점수 (python) (0) | 2021.04.19 |
BOJ 13305 주유소 (python) 파이썬 (0) | 2021.04.15 |
BOJ 9372 상근이의 여행 (python) (0) | 2021.04.13 |