문제
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
풀이
문제가 약간 이상하다. 당연히 경우의 수를 구하는 것이기 때문에 중복을 제거해줘야 한다고 생각했는데 중복을 제거하면 틀리게 나온다.
조합을 사용하거나 재귀를 이용하여 풀 수 있다. 조합을 사용하는 방법이 더 직관적이지만, 재귀를 이용하는 방법이 메모리나 속도면에서 효율적이다.
리스트의 첫번째 인덱스에서 시작해서 해당 요소를 건너뛰고 다음 인덱스로 가거나 해당 요소를 포함하고 다음 인덱스로 가는 식으로 재귀함수를 구현할 수 있다.
코드
조합
import sys
from itertools import combinations
n, s = map(int, sys.stdin.readline().split())
nums = [int(x) for x in sys.stdin.readline().split()]
cnt = 0
for i in range(1, n+1):
combis = list(combinations(nums, i))
for combi in combis:
if sum(combi) == s:
cnt += 1
print(cnt)
재귀
import sys
n, s = map(int, sys.stdin.readline().split())
nums = [int(x) for x in sys.stdin.readline().split()]
cnt = 0
def solve(idx, total):
global cnt
if idx >= n:
return
total += nums[idx]
if total == s:
cnt += 1
solve(idx+1, total)
solve(idx+1, total-nums[idx])
solve(0, 0)
print(cnt)
'CS > 알고리즘 문제 풀이' 카테고리의 다른 글
[백준] 2293 - 동전1 [Python(파이썬)] (0) | 2021.01.12 |
---|---|
[백준] 11057-오르막 수 [Python(파이썬)] (0) | 2021.01.10 |
[백준] 4963 - 섬의 개수 [Python(파이썬)] (0) | 2021.01.10 |
[백준] 6603 - 로또 [Python(파이썬)] (0) | 2021.01.07 |
[백준] 14502 - 연구소 [Python(파이썬)] (0) | 2021.01.06 |
문제
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
풀이
문제가 약간 이상하다. 당연히 경우의 수를 구하는 것이기 때문에 중복을 제거해줘야 한다고 생각했는데 중복을 제거하면 틀리게 나온다.
조합을 사용하거나 재귀를 이용하여 풀 수 있다. 조합을 사용하는 방법이 더 직관적이지만, 재귀를 이용하는 방법이 메모리나 속도면에서 효율적이다.
리스트의 첫번째 인덱스에서 시작해서 해당 요소를 건너뛰고 다음 인덱스로 가거나 해당 요소를 포함하고 다음 인덱스로 가는 식으로 재귀함수를 구현할 수 있다.
코드
조합
import sys
from itertools import combinations
n, s = map(int, sys.stdin.readline().split())
nums = [int(x) for x in sys.stdin.readline().split()]
cnt = 0
for i in range(1, n+1):
combis = list(combinations(nums, i))
for combi in combis:
if sum(combi) == s:
cnt += 1
print(cnt)
재귀
import sys
n, s = map(int, sys.stdin.readline().split())
nums = [int(x) for x in sys.stdin.readline().split()]
cnt = 0
def solve(idx, total):
global cnt
if idx >= n:
return
total += nums[idx]
if total == s:
cnt += 1
solve(idx+1, total)
solve(idx+1, total-nums[idx])
solve(0, 0)
print(cnt)
'CS > 알고리즘 문제 풀이' 카테고리의 다른 글
[백준] 2293 - 동전1 [Python(파이썬)] (0) | 2021.01.12 |
---|---|
[백준] 11057-오르막 수 [Python(파이썬)] (0) | 2021.01.10 |
[백준] 4963 - 섬의 개수 [Python(파이썬)] (0) | 2021.01.10 |
[백준] 6603 - 로또 [Python(파이썬)] (0) | 2021.01.07 |
[백준] 14502 - 연구소 [Python(파이썬)] (0) | 2021.01.06 |