본문 바로가기
Algorithm

[Brute Force] 백준 1182. 부분수열의 합 - Python

by jangThang 2022. 1. 18.
반응형

 

[ Contents ]

     

     

    1. 문제 (링크 참조)

     

    1182번: 부분수열의 합

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

    www.acmicpc.net

     

     

     

    2. 문제 풀이

     N개의 정수에서 뽑은 부분 수열의 합이 S가 되는 경우의 수를 구하는 문제입니다. 모든 경우의 수를 시험해봐야 하므로, 브루트 포스문제입니다.

     

     

    2022.01.16 - [Algorithm] - [Algorithm] 브루트 포스(Brute Force)는 노가다 기법?

     

    [Algorithm] 브루트 포스(Brute Force)는 노가다 기법?

    1. 브루트 포스란?  Brute(짐승 같은, 난폭한) + Force(힘, 폭력)의 합성어입니다. 무식하게 푸는 기법으로, '노가다'에 가까운 접근법입니다. 모든 경우의 수를 시험해보며 문제를 해결합니다.  브루

    star7sss.tistory.com

     S보다 큰 정수는 경우의 수에서 배제할 수 있을지 않을까? 라고 생각할 수도 있습니다. 하지만, N개의 정수에는 음수도 포함됩니다. 따라서 배제 없이, 모든 경우의 수를 '조합'으로 구해야 합니다.

     

     

     

     

    3. 코드

    from itertools import combinations
    
    n, s = map(int, input().split())
    arr = list(map(int, input().split()))
    cnt = 0
    
    for i in range(n):
        subarr = combinations(arr, i+1)
        for j in subarr:
            if sum(j) == s:
                cnt += 1
    print(cnt)

     조합(Combination)을 사용하여 모든 경우의 수를 구합니다. itertools 라이브러리를 이용합니다.

     

     

    itertools.combinations(lst, n): lst 리스트에서 n개를 뽑는 조합

     1부터 n개를 뽑는 모든 조합을 구하고, 합이 S인지 판별합니다.

     

     

     

    반응형

    댓글