본문 바로가기

Dev. Etc/Algorithm

[JAVA] 백준 알고리즘 1182번 문제풀이 (부분집합의 합)

 

 

 

 

https://www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.

www.acmicpc.net

 

 

 

 

● 부분집합의 합 (1182번)

 

 

 

 

 

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int c = sc.nextInt();
        int[] a = new int[n];
        for (int i=0; i<n; i++) {
            a[i] = sc.nextInt();
        }
        int ans = 0;
        for (int i=1; i<(1<<n); i++) { // 크기가 n인 모든 부분집합을 완성
            int sum = 0;
            for (int k=0; k<n; k++) {
                if ((i&(1<<k)) != 0) { //i&(1<<k)를 통해 부분집합을 검사 
                    sum += a[k];
                }
            }
            if (sum == c) {
                ans += 1;
            }
        }
        System.out.println(ans);
    }
}

↓ 소스풀이 ↓

우선, 비트마스크를 사용해서 문제를 풀었습니다.

for (int i=1; i<(1<

그리고나서, if ((i&(1<

처음입력받은 c변수와 sum이 같다면 ans를 더해줌으로써 갯수를 세어줍니다.

 

 

< 백준알고리즘 강의를 보고 참고하였습니다! >