데이터사이언스 기록기📚

[백준/Python] 1182번(브루트포스, 백트래킹)_부분수열의 합 본문

Coding Test/백준(Python)

[백준/Python] 1182번(브루트포스, 백트래킹)_부분수열의 합

syunze 2023. 4. 26. 21:59

📌문제 유형

브루트포스 알고리즘, 백트래킹 (실버2)

 

📌문제

 

1182번: 부분수열의 합

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

www.acmicpc.net

 

📌나의 문제풀이

from itertools import combinations

n, s = map(int,input().split())
num_list = list(map(int,input().split()))
ans = 0

for i in range(1, n+1):
    li = list(combinations(num_list, i))
    for j in range(len(li)):
        if sum(li[j]) == s:
            ans += 1

print(ans)

 

📌 다른사람의 문제풀이

 

[백준] 1182번 부분수열의 합 - 파이썬(Python)

문제 (링크) https://www.acmicpc.net/problem/1182 1182번: 부분수열의 합 첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고

seongonion.tistory.com

import sys
input = sys.stdin.readline
n, s = map(int, input().split())
arr = list(map(int, input().split()))
cnt = 0

def subset_sum(idx, sub_sum):
    global cnt

    if idx >= n:
        return

    sub_sum += arr[idx]

    if sub_sum == s:
        cnt += 1
    
    # 현재 arr[idx]를 선택한 경우의 가지
    subset_sum(idx+1, sub_sum)

    # 현재 arr[idx]를 선택하지 않은 경우의 가지
    subset_sum(idx+1, sub_sum - arr[idx])

subset_sum(0, 0)
print(cnt)

 

📌 리뷰 

- N이 20개로 작은 편이어서 combination 이용 가능, 숫자가 크면 이용 못하므로 DFS로 완탐하는 방법도 생각하기

 
728x90
Comments