1 minute read


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