728x90
https://www.acmicpc.net/problem/1182
package BKD_0x0C_BackTracking;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_1182 {
static int N,S;
static int[] arr= new int[30];
static int count=0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
S = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++){
arr[i] = Integer.parseInt(st.nextToken());
}
func(0,0);
if(S==0) count--; // 왜 인지 포스팅 할 때 생각해보기
System.out.println(count);
}
static void func(int cur, int sum){
if(cur == N){
if(sum == S){
count++;
}
return;
}
func(cur+1,sum);
func(cur+1,sum+arr[cur]);
}
}
더보기
처음 풀이를 진행 할 때는 Base Condition을 sum==S일 때로만 지정하고 진행.
현재 index 이후의 값들만 취급하여 부분 수열을 찾으려 시도.
-> 중복된 부분 집합에 대해서 탐색하지 않아 불필요한 호출 진행
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int S;
static int[] arr;
static boolean[] visited;
static int count=0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
S = Integer.parseInt(st.nextToken());
arr = new int[N];
visited = new boolean[N];
st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++){
arr[i] = Integer.parseInt(st.nextToken());
}
func(0,arr[0]);
System.out.println(count);
}
static void func(int idx, int sum){
if(sum == S){
count++;
return;
}
for(int i=idx;i<N;i++){
if(visited[i]) continue;
visited[i] =true;
func(i,sum+arr[i]);
visited[i] = false;
}
}
}
❗️❗️더할지 말지를 결정한다!! ❗️❗️
함수 정의
- func(int cur, int sum) : 부분 수열의 합을 계산하는 함수
Base Condition :
- cur ==N
Recursion
- 현재 수를 더하지 않고 부분 수열의 합을 구할 때 : func(cur+1, sum)
- 현재 수를 더하여 부분 수열의 합을 구할 때 : func(cur+1, sum+arr[cur])
728x90
'🐣 알고리즘 삐약 > 💻 백준 삐약' 카테고리의 다른 글
101 삐약 : 백준 1620 | 나는야 포켓몬 마스터 이다솜 [바킹독| HASH |JAVA] (0) | 2024.10.31 |
---|---|
100 삐약 : 백준 7785 | 회사에 있는 사람 [바킹독| HASH |JAVA] (0) | 2024.10.31 |
98 삐약 : 백준 9663 | N-Queen [바킹독| 백트래킹 |JAVA] (0) | 2024.09.15 |
97 삐약 : 백준 2448 | 별 찍기 - 11 [바킹독| 재귀 |JAVA] (1) | 2024.09.15 |
96 삐약 : 백준 2447 | 별 찍기 - 10 [바킹독| 재귀 |JAVA] (0) | 2024.09.15 |