일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 개발자
- 쓰릴오브파이트
- 운동
- Writing
- 읽기
- 링피트
- realclass
- 매일
- 30분
- 10분
- English
- 사이드
- 파비최
- 리얼 클래스
- 괜찮음
- 3줄정리
- 잡생각
- 월간
- Daily Challenge
- leetcode
- 뭐든
- FIT XR
- 화상영어
- 영어공부
- 만화도
- Problem Solving
- 프로젝트
- 스탭퍼
- 미드시청
- 영어원서읽기
Archives
- Today
- Total
파비의 매일매일 공부기록
5.4 부분집합의 합 구하기 - 재귀 본문
0과 양의 정수로 이루어진 집합 N과 양의 정수 X가 있을 때
N의 부분집합 중에 원소의 합이 X인 부분집합이 존재하는지 찾는 문제.
예를 들어 N = {3,2,7,1}, X=6인 경우
부분집합 중 하나인 {3,2,1}의 합이 6이므로 True를 반환.
집합 내의 어떤 원소 P에 대해
1. 부분집합에 P를 포함하면 집합의 나머지에서 합이 X-P가 되는 부분집합을 찾으면 됨.
2. 부분집합에 P를 포함하지 않는다면 집합의 나머지에서 합이 X가 되는 부분집합을 찾으면 됨.
재귀 함수 종료 조건
1. X가 0이 되었는지 확인(성공)
2. 집합 내의 원소를 모두 사용했는지 확인(실패)
3. 원소의 값이 X보다 큰 경우. 재귀 호출하지 않아도 됨(모든 원소는 0과 양의 정수이므로 마이너스가 될 수 없음)
위의 조건들을 가지고 재귀 호출로 구현하면 다음과 같다.
def solve(ar, n, x):
if x == 0:
return True
if n == 0:
return False
if ar[0] > x:
return solve(ar[1:], n - 1, x)
return solve(ar[1:], n - 1, x) or solve(ar[1:], n - 1, x - ar[0])
if __name__ == '__main__':
ar = list(map(int, input().split()))
n = len(ar)
x = int(input())
print(solve(ar, n, x))
시간 복잡도는 O(2^n).
재귀까지만 구현하고 다음 포스팅에 DP로 구현할 예정.
반응형
'Study > Algorithm 문제풀이' 카테고리의 다른 글
5.5 최장 공통 부분 수열 길이 구하기 - 재귀 (0) | 2021.09.12 |
---|---|
5.4 부분집합의 합 구하기 - DP (0) | 2021.09.11 |
DP 정복 - 5.3 문자열 인터리빙 확인 문제 (0) | 2021.09.08 |
DP 정복 - 5.2 직사각형에서 총 경로 수 구하기 (0) | 2021.09.07 |
DP 정복 - 5.1 최소 교정 비용 문제 (0) | 2021.09.01 |
Comments