알고리즘/백준

[백준]1182 부분수열의 합(Python)

cha_eyoon 2024. 1. 3. 15:58

https://www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.

www.acmicpc.net

 

문제 접근

 

역시나 가장 먼저 생각난 방식은 조합이다.

total이라는 리스트에 가능한 조합을 다 담아두고 반복문을 돌면서 합과 일치하는 경우를 카운트 => 불필요 

다 풀고 나니 total, compo 리스트 선언 필요하지 않고, 각 경우마다의 sum과 S의 일치 여부를 카운트 

 

코드
from itertools import combinations

N, S = map(int, input().split())
cnt = 0

# total = []
my_list = list(map(int, input().split()))
# print(my_list)

for i in range(1, N+1):
    # compo=[]
    k = list(combinations(my_list, i))
    for j in k:
        # compo.append(list(j))
        p = sum(list(j))
        if p == S:
            cnt += 1
    # total.append(compo)


print(cnt)

 

회고

 

조합이 만들어지면 튜플 형식으로 만들어지기 때문에 반드시 리스트로 감싸야 한다.

찍는게 버릇이 되서 계속 타입을 찍어보는데 시간이 너무 소요된다.