[BOJ] 1182 부분수열의 합

iinnuyh_s·2024년 1월 22일
0

완전탐색

목록 보기
4/4
post-thumbnail
post-custom-banner

부분수열의 합

풀이

  • 크기가 양수인 부분 수열 중에서, 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구해라.
  • 1부터 N까지 조합의 모든 경우의 수를 구해서 S가 되면 answer++를 해줬다.

정답 풀이

import java.util.*;
import java.io.*;
public class Main {
    static int answer = 0;
    static int S;
    static int[] arr;
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        S = Integer.parseInt(st.nextToken());
        arr = new int[N];
        st = new StringTokenizer(br.readLine());
        for(int i=0;i<N;i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }
        for(int size=1;size<=N;size++)
        {
            dfs(0,size,new boolean[N],0,0);
        }
        System.out.println(answer);
    }
    private static void dfs(int sum, int size,boolean[] visited, int depth,int start){
       if(depth==size){
           if(sum==S){
               answer++;
               return;
           }
       }
       for(int i=start;i<arr.length;i++){
           if(!visited[i]){
               visited[i] = true;
               dfs(sum+arr[i],size,visited,depth+1,i+1);
               visited[i] = false;
           }
       }
    }
}
  • 풀이를 찾아보니까, 조합 말고 그냥 선택했을 때, 안했을 때를 더 쉽게 나타내는 방법이 있다.
public static void dfs(int index, int sum){
	if(index==N){
    	if(sum==target){
        	answer++;
        }
        return;
    }
    dfs(index+1,sum+arr[index]); 현재 원소를 선택했을 때
    dfs(index+1,sum);	현재원소를 선택 안했을 때
}
post-custom-banner

0개의 댓글