문제 출처
https://www.acmicpc.net/problem/1182
접근 방식 및 풀이
- 투포인트 알고리즘, DFS 활용 하여 해결 할 수 있다.
- DFS 알고리즘을 적용하여 지금 위치의 원소를 선택하거, 선택하지 않거나 2가지 조건을 재귀함수로 계속 호출하였다.
소스 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
public class Main {
static int N, S, count=0;
static int[] arr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N= sc.nextInt();
S= sc.nextInt();
arr = new int[N];
for (int i = 0; i <N ; i++) {
arr[i] = sc.nextInt();
}
dfs(0,0);
if(S==0){// count 합이 0인 경우 공집합도 포함되므로 그 수를 하나 빼주고 출력
count--;
System.out.println(count);
}else {
System.out.println(count);
}
}
private static void dfs(int v , int su){
if(v==N){// dfs로 돌며 누적시키다가 위치를 나타내는 v이 마지막 위치로 오면 원하는 값인지 아닌지 체크하여 count
if(su == S){
count++;
}
return;
}
// 부분수열, 지금 위치의 원소를 선택하거, 선택하지 않거나
dfs(v+1, su+arr[v]); // 지금 위치의 원소를 선택
dfs(v+1, su); // 선택하지 않음.
}
}
|
결과
'Competition > Baekjoon' 카테고리의 다른 글
[백준] 7453번 자바 합이 0인 네 정수 (0) | 2020.04.30 |
---|---|
[백준] 10819번 자바 차이를 최대로 (0) | 2020.04.29 |
[백준] 1208번 자바 부분수열의 합2 (0) | 2020.04.27 |