티스토리 뷰

PS/BOJ Python

1182번 - 부분수열의 합

zpqmdh 2023. 3. 25. 13:39

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

 

1182번: 부분수열의 합

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

www.acmicpc.net

이 문제는 백트래킹을 활용한 간단한 조합 문제이다.

그런데 '틀렸습니다' 가 떴다.

그때 작성한 코드는 아래와 같다.

# 부분수열의 합
import sys
input = sys.stdin.readline
# backtracking
def dfs(sum_value, idx):
    global answer
    if len(res) > 0 and sum_value == S:
        answer += 1
        return
        
    for i in range(idx, len(arr)):
        if visited[i] == False:
            visited[i] = True
            res.append(arr[i])
            dfs(sum(res), i+1)
            res.pop()
            visited[i] = False

N, S = map(int, input().split())
arr = list(map(int, input().split()))
visited = [False for _ in range(N)]
res = []
answer = 0

dfs(0, 0)

print(answer)

반례는 다음과 같다.

3 0

1 -1 0

 

만약 return을 해준다면 [1, -1] 일 때 함수가 return 해버리기 때문에 [1, -1, 0]은 고려하지 못한다.

따라서 [1, -1] 과 [0] 의 경우만을 answer에 저장한다. 

하지만 답은 [1, -1], [1, -1, 0], [0] 으로 총 answer에는 3이 저장되어야 한다.

따라서 아래처럼 수정하니 맞았다 :)

# 부분수열의 합
import sys
input = sys.stdin.readline
# backtracking
def dfs(sum_value, idx):
    global answer
    if len(res) > 0 and sum_value == S:
        answer += 1
        
    for i in range(idx, len(arr)):
        if visited[i] == False:
            visited[i] = True
            res.append(arr[i])
            dfs(sum(res), i+1)
            res.pop()
            visited[i] = False

N, S = map(int, input().split())
arr = list(map(int, input().split()))
visited = [False for _ in range(N)]
res = []
answer = 0

dfs(0, 0)

print(answer)

 

'PS > BOJ Python' 카테고리의 다른 글

10815번 - 숫자 카드  (0) 2023.03.29
17478번 - 재귀함수가 뭔가요?  (0) 2023.03.28
2805번 - 나무 자르기  (0) 2023.03.24
1764번 - 듣보잡  (0) 2023.03.23
10845번 - 큐  (0) 2023.03.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함