일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 영어원서읽기
- 괜찮음
- 월간
- 프로젝트
- 읽기
- 화상영어
- English
- 뭐든
- 쓰릴오브파이트
- Problem Solving
- realclass
- 파비최
- leetcode
- Writing
- 스탭퍼
- 링피트
- 3줄정리
- 운동
- 개발자
- 30분
- FIT XR
- 리얼 클래스
- 만화도
- 영어공부
- 매일
- Daily Challenge
- 10분
- 미드시청
- 잡생각
- 사이드
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