문제
N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
출력
첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다.
내가 푼 풀이
- 주어진 수열을 1부터 N만큼 뽑아서 합산한 값이 S가 된다면 경우의 수를 더한다.
- 수열을 뽑는건 조합을 이용한다.
import Foundation
// 입력받기
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let N = input[0], S = input[1]
let nums = readLine()!.split(separator: " ").map{Int(String($0))!}
var result = 0
// 조합(숫자의 순서와 관계없이 선택)
func combi(_ targetArr: [Int],_ targetNum: Int,_ index: Int,_ arr: [Int] ) {
if arr.count == targetNum {
if arr.reduce(0, +) == S { result += 1 }
return
}
for i in index..<targetArr.count {
combi(targetArr, targetNum, i+1, arr + [targetArr[i]])
}
}
for i in 1...N {
combi(nums, i, 0, [])
}
print(result)
'코딩테스트 > 백준' 카테고리의 다른 글
BOJ-14500 테트로미노 Swift (Brute-force) (0) | 2024.04.11 |
---|---|
BOJ-1759 암호 만들기 Swift (0) | 2024.04.10 |
BOJ-15686 치킨 배달 Swift (0) | 2024.04.10 |
BOJ-14889 스타트와 링크 Swift (0) | 2024.04.08 |
BOJ-14888 연산자끼워넣기 Swift (0) | 2024.04.08 |