티스토리 뷰
반응형
문제
집합 A는 1부터 12까지의 숫자를 원소로 가지고 있다. 이 때, 원소의 개수가 N개이며 그 합이 K인 부분집합의 개수를 출력한다.
문제 상황
- 부분 집합을 완전 탐색으로 전체 조사해야한다.
해결 전략
- 원소의 개수가 12개 이므로 부분집합의 총 수는 공집합을 포함하여 2^12 = 4096으로 크기가 작기 때문에 완전탐색으로 하여도 문제가 없다. 완전탐색하며 합이 K와 같은지를 판별하면 된다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
# 부분 집합의 집합을 찾는 함수
def subset(lst):
n = len(lst)
# 부분 집합들을 담을 집합
result = []
# 2^n 까지 순회 (0, 1, 10, 11, ... )
# -> (공집합, 마지막 요소만 포함, 마지막에서 2번째 요소만 포함, ...)
for i in range(1<<n):
# 새로운 i에서 부분집합을 초기화
temp = []
# 전체집합 lst의 원소를 첫번째부터 마지막까지 본다
for j in range(n):
# 1<<3 = 8
# 예를 들어, i가 11로 고정되어 있으면 1<<j는 1을 0, 1, 2, .. 로 증가시키면서
# i가 1인 부분에서만 요소를 추가한다. 이 때 j는 lst의 j번째 요소를 의미한다.
if i&(1<<j):
# i의 비트 자리가 1인 요소를 부분집합에 담는다.
temp.append(lst[j])
# 완성된 부분집합을 부분집합의 집합에 담아준다.
result.append(temp)
return result
A = [i for i in range(1,13)]
T = int(input())
subset_A = subset(A)
for idx in range(T):
N, K = map(int, input().split())
num_Subset = 0
for i in range(len(subset_A)):
# 부분집합의 개수가 N이면서 합이 K인 값의 개수를 더해준다.
if sum(subset_A[i]) == K and len(subset_A[i]) == N:
num_Subset += 1
print(f"#{idx+1} {num_Subset}")
|
cs |
해설
- subset을 찾는 함수를 만들어 사용하였다. 부분집합의 집합을 만드는 함수를 만들어 전체 조사하였고, 이 때에 비트 연산자를 활용하였다. 예를 들어, 원소가 4개인 부분집합의 경우 1<<4를 하면 0 ~ 1111 까지 순회하며 각 자리가 1인 부분의 원소를 부분집합에 담았다. 1<<j 는 j가 0에서 부터 3까지 이므로 1, 10, 100, 1000의 경우, 즉 첫번째 요소부터 네번째 요소까지를 검색하여 (첫번째 요소가 1인가?) (두번째 요소가 1인가?) 등을 계속 체크하여 값을 넣어준다.
새로 학습한 것 & 실수
- subset 함수를 만들 때에 temp 폴더와 result 폴더를 넣는 위치가 고민되었다. 또 코드에 12번째, 16번째 줄이 이해하기 힘들었다.
출처 - https://swexpertacademy.com/main/
반응형
'알고리즘 학습 > 삼성 SWEA' 카테고리의 다른 글
SWEA - 괄호 검사(4866) [Python] (0) | 2020.08.25 |
---|---|
SWEA - 특별한 정렬 [Python] (0) | 2020.08.25 |
SWEA - 색칠하기 [Python] (0) | 2020.08.24 |
SWEA - 구간합 [Python] (0) | 2020.08.24 |
SWEA - 숫자 카드 [Python] (0) | 2020.08.24 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 섬의개수#백준알고리즘#Python
- 암호코드#dp#BOJ#Python
- 백준 알고리즘#BackTracking
- 배열합치기#분할정복#BOJ#Python
- 순열사이클#BOJ#Python
- 파이썬알고리즘인터뷰#4장
- 텀 프로젝트#백준알고리즘#Python
- 나무자르기#BOJ#이분탐색#Python
- 날짜 계산#BOJ#완전탐색#Python
- django
- 미로 탐색#백준알고리즘#Python
- N으로 표현#DP#Programmers#Python
- Brackets#Stacks and Queues#Codility#Python
- API#lazy#
- 반복수열#백준알고리즘#Python
- filter#isalnum#lower
- 종이자르기#분할정복#BOJ#Python
- 토마토#백준알고리즘#Python
- Triangle#Sorting#Codility#Python
- 리모컨#완전탐색#BOJ#Python
- 공유기 설치#BOJ#이분탐색#Python
- 터틀비치#리콘#xbox#controller
- 쿼드트리#BOJ#분할정복#Python
- Swift#Tuples#Range
- 랜선자르기#이분탐색#BOJ#Python
- 병든 나이트#BOJ#탐욕법#Python
- Distinct#Codility#Python
- PassingCars#Codility#Python
- django#slicing
- NumberofDiscIntersections#Codility#Sort#Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함