[백준] 1182 부분수열의 합, Go/Java
0. 들어가면서
부분수열의 합
백트래킹 문제이다.
1. Java
1.1 내가 푼 코드
package bj.ch12_Backtracking;
import java.io.*;
import java.util.*;
public class BJ_1182_부분수열의합_01 {
/*
* 컴비네이션으로 접근
* 1개~N개가 원소인 C들
*/
static int N, S;
static int[] nums;
static int[] subArr;
static int result = 0;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
S = Integer.parseInt(st.nextToken());
nums = new int[N];
subArr = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
nums[i] = Integer.parseInt(st.nextToken());
}
for (int i = 1; i <= N; i++) {
nCr(i, 0, 0);
}
System.out.println(result);
}
private static void nCr(int r, int count, int start) {
if (count == r) {
int sum = 0;
for (int i = 0; i < r; i++) {
sum += subArr[i];
}
if (sum == S) {
result++;
}
return;
}
for (int i = start; i < N; i++) {
subArr[count] = nums[i];
nCr(r, count + 1, i + 1);
}
}
}
1.3 해설
- 나는 1부터 N개 까지의 원소를 가진 부분수열을 구했다.
- 하지만 애초에 제목처럼 부분수열로 접근해서 2^N - 1개의 부분수열을 구하고, 그 부분수열의 합이 S인 것을 구하면 된다.
- 이렇게도 풀어보자
- 사실 nc0+nc1+nc2+nc3+…+ncn = 2^n 이기에, 계산량은 똑같을 것이다.
2. Go
CLOSING
ㅠㅠ
Leave a comment