문제

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)

+ Recent posts