반응형
- 알고리즘 분류 : DFS
- 사용 언어 : JAVA
- 문제 요점
- 0일 때, 1개를 빼줘야 한다.
소스 설명은 주석을 참고해주세요.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static int N, S;
public static int[] arr;
public static int cnt = 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];
st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
DFS(0, 0);
// 부분수열의 원소가 하나도 없을 때에도 0이기 때문에(공집합), 1개를 빼줘야 한다.
// 부분수열의 원소가 하나도 없는데 왜 0일까? 위에 DFS(0,0)에서 0으로 시작했기 때문
if(S == 0) {
cnt--;
}
System.out.println(cnt);
}
// depth: 어디까지 탐색했는 지 알려주는 변수
// num : 현재의 값을 가지는 변수
public static void DFS(int depth, int num) {
// 다 탐색했을 때
if(depth == N) {
if(num == S) // num이 S일 때 카운트 증가
cnt++;
return;
}
DFS(depth+1, num + arr[depth]); // 현재 인덱스를 값에 추가
DFS(depth+1, num); // 현재 인덱스 무시
}
}
반응형
'Algorithm' 카테고리의 다른 글
[BAEKJOON] 1202번 : 보석 도둑 (JAVA) (0) | 2022.12.09 |
---|---|
[BAEKJOON] 18111번 : 마인크래프트 (JAVA) (0) | 2022.12.04 |
[BAEKJOON] 1103번 : 게임 (JAVA) (0) | 2022.11.27 |
[BAEKJOON] 1937번 : 욕심쟁이 판다 (JAVA) (0) | 2022.11.26 |
[BAEKJOON] 4949번 : 균형잡힌세상 (JAVA) (0) | 2022.11.20 |