Per ardua ad astra !
I'm On My Way
Per ardua ad astra !
전체 방문자
오늘
어제
  • 분류 전체보기 (126)
    • Algorithm (50)
      • 백준 (30)
      • SWEA (3)
      • JUNGOL (3)
      • Programmers (5)
      • LeetCode (2)
    • 안드로이드 개발 (6)
      • Java로 개발 (0)
      • Kotlin으로 개발 (3)
    • Spring (41)
      • Spring기본 (17)
      • JPA기본 (15)
      • JPA활용 SpringBoot 기본 (9)
      • API 개발 기본 (0)
    • 네트워크 (3)
    • 운영체제 (0)
    • Life (3)
      • 책 (0)
      • 자기계발 (1)
      • 일상 (2)
    • 노마드코더 (3)
      • python으로 웹 스크래퍼 만들기 (3)
    • 프로그래밍 언어 (17)
      • Java 기본 (2)
      • 코틀린 기본 (15)

블로그 메뉴

  • 홈
  • 방명록

인기 글

hELLO · Designed By 정상우.
Per ardua ad astra !

I'm On My Way

Algorithm/백준

[Java] BaekJoon 1182. 부분수열의 합(실버2) (부분집합)(DFS)

2021. 10. 11. 22:18

문제출처: https://www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

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

www.acmicpc.net

 

문제이해

 

목표

N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.

 

풀이

브루토 포스로 부분집합의 모든 케이스(2^n)를 구해서 부분수열의 합이 S가 나오는 경우를 찾는다.

 

주의 

단, S가 0일때 모든 값을 false로 처리하여 아예 값이 없는 부분집합의 경우도 체크하기 때문에, 이런 케이스를 제외하기 위해서 진짜 부분집합의 경우인지 확인하기 위해 check 처리해준다.

 

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

import static java.lang.System.in;

public class 부분수열의합 {
    private static int N, S;
    private static boolean[] visited;
    private static int answer;
    private static int[] intArr;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        S = Integer.parseInt(st.nextToken());
        answer = 0;
        visited = new boolean[N];
        String[] strArr = br.readLine().split(" ");
        intArr = new int[N];
        for (int i = 0; i < N; i++) {
            intArr[i] = Integer.parseInt(strArr[i]);
        }

        getSubset(0);
        System.out.println(answer);
    }

    static private void getSubset(int now){
        if (now == N) {
            int sum = 0;
            boolean check = false;
            for (int i = 0; i < N; i++) {
                if(visited[i]){
                    sum += intArr[i];
                    check = true;
                }
            }
            if (sum == S && check) {
                answer++;
            }
            return;
        }

        visited[now] = true;
        getSubset(now + 1);

        visited[now] = false;
        getSubset(now + 1);

    }

}
저작자표시 비영리 (새창열림)
    'Algorithm/백준' 카테고리의 다른 글
    • [Java] BaekJoon 1890. 점프 (DP)(백트래킹) (실버2)
    • [Java] BaekJoon 15591. MooTube(골드5) (그래프 탐색) (DFS) (BFS)
    • [Java] BaekJoon 2800. 괄호 제거(골드5) (부분집합) (DFS)
    • [Java] BaekJoon 2661. 좋은수열(골드4) (DFS) (백트래킹)
    Per ardua ad astra !
    Per ardua ad astra !
    개발자 지망생이며 열심히 공부하고 기억하기 위한 블로그입니다.

    티스토리툴바