boj

백준 1182 부분수열의 합 -python

boj-1182

Posted by 동식이 블로그 on November 13, 2019

백준 1182 부분수열의 합 -python

문제

  • 브루트 포스 문제


문제풀이

  • 재귀 함수 종료조건을 인덱스 범위를 벗어난 경우
    • 이때 부분수열의 더한 값이 s와 같으면 return


code

  1. 재귀를 이용한 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def f(idx, d):
    global res
    if(idx >= n):
        if(s == d):
            res += 1
            return
    else:
        # 원소를 포함하는 경우
        f(idx+1, d+arr[idx])
        # 원소를 포함하지 않는 경우
        f(idx+1, d)

n, s = map(int, input().split())
arr = list(map(int, input().split()))
res = 0
f(0,0)
# s가 0인, 즉 공집합인 경우에는 정답에서 -1을 해줌
if(s):
    print(res)
else:
    print(res - 1)
  1. 멱집합(powerset)을 이용한 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def powerset(arr):
    arr_size = len(arr)
    res = []
    for i in range(2**arr_size):
        # str class의 bin, zfill로 binary값을 이용해서 구하기
        check = bin(i)[2:].zfill(arr_size)
        subset = []
        for j in range(arr_size):
            if(check[j] == '1'):
                subset.append(arr[j])
        res.append(subset)
    return res

n, s = map(int, input().split())
arr = list(map(int, input().split()))
arr = powerset(arr)
cnt = 0
for i in arr:
    if(sum(i) == s):
        cnt += 1
print(cnt if s else cnt-1)