본문 바로가기
ALGORITHM/백준

[BOJ/PYTHON] 1182. 부분수열의 합

by 뭉망뭉 2023. 8. 17.

백준 문제 링크: https://www.acmicpc.net/problem/1182

문제 요약

N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수

핵심 아이디어

브루트포스로 다 구해주면 된다.

경우의 수를 백트래킹을 사용해 구해줬다.

풀이

# silver2-1182. 부분수열의 합

import sys
input = sys.stdin.readline

n, s = map(int, input().split())
nums = list(map(int, input().split()))
cnt = 0 # 경우의 수
array = []

def back(depth, nums_sum): 
    global cnt
    if depth == n:
        if nums_sum == s:
            cnt += 1
        return    
    back(depth + 1, nums_sum) # 새 숫자 안 더해주는 케이스
    back(depth + 1, nums_sum + nums[depth]) # 인덱스(depth)에 해당하는 숫자 더해주는 케이스

back(0, 0)
if s == 0: cnt -= 1 # 부분수열의 길이가 0인 경우 (부분수열이 아무것도 없을 때) 케이스 대응
print(cnt)

Trouble Shooting

인덱스 백트래킹이 아니라 백트래킹을 해줘서 틀렸었다.

def back(idx):
    global cnt
    if array and sum(array) == s:
        cnt += 1
    for i in range(idx, n):
        array.append(nums[i])
        back(i+1)
        array.pop()

back(0)
print(cnt)

원래 코드는 nums_cnt까지 세 가지를 받았는데, 이렇게 하면 카운트 변수에 따로 -1 처리를 안 해줘도 된다.

# nums_cnt를 받아서 if s == 0: cnt -= 1를 안 해주는 코드
def back(depth, nums_sum, nums_cnt): 
    global cnt
    if depth == n:
        if nums_sum == s and nums_cnt > 0:
            cnt += 1
        return    
    back(depth + 1, nums_sum, nums_cnt) # 새 숫자 안 더해주는 케이스
    back(depth + 1, nums_sum + nums[depth], nums_cnt + 1) # 인덱스(depth)에 해당하는 숫자 더해주는 케이스

back(0, 0, 0)

실행 시간

메모리 31256KB, 시간 264ms (python3)

'ALGORITHM > 백준' 카테고리의 다른 글

[BOJ/PYTHON] 1074. Z  (0) 2023.08.17
[BOJ/PYTHON] 2438. 별 찍기 - 1  (0) 2023.08.17
[BOJ/PYTHON] 10988. 팰린드롬인지 확인하기  (0) 2023.08.17
[BOJ/PYTHON] 1000. A+B  (0) 2023.08.17
[BOJ/PYTHON] 11170. 0의 개수  (0) 2023.07.27

댓글