728x90
반응형
https://www.acmicpc.net/problem/1182
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
이 문제를 풀면서 백트래킹과 DFS의 차이가 헷갈렸다.
중간에 아닌것 같으면 되돌아가는 것이 백트래킹, 끝까지 가는 것이 DFS라고 하는데 다른 풀이를 보면 거의 같은 코드인데 어떤 사람은 백트래킹, 어떤 사람은 DFS라고 한다.... 더 헷갈린다.
static public void dfs(int sum, int index) {
if (index >= N)
return;
if (sum + a[index] == S) // 합이 같은 경우
result++;
// 더하는 경우
dfs(sum + a[index], index + 1);
// 안 더하는 경우
dfs(sum, index + 1);
}
index는 더할 배열의 인덱스이다. 모든 인덱스를 확인했다면 그만한다.
합이 같은 경우 result를 더해주고 현재 인덱스의 배열을 더하는 경우, 더하지 않는 경우로 나눈다.
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, S, result = 0;
static int[] a;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input;
input = br.readLine();
StringTokenizer st = new StringTokenizer(input);
N = Integer.parseInt(st.nextToken());
S = Integer.parseInt(st.nextToken());
input = br.readLine();
st = new StringTokenizer(input);
a = new int[N];
for (int i = 0; i < N; i++)
a[i] = Integer.parseInt(st.nextToken());
dfs(0, 0);
System.out.println(result);
}
static public void dfs(int sum, int index) {
if (index >= N)
return;
if (sum + a[index] == S) // 합이 같은 경우
result++;
// 더하는 경우
dfs(sum + a[index], index + 1);
// 안 더하는 경우
dfs(sum, index + 1);
}
}
728x90
반응형
'코테 > JAVA' 카테고리의 다른 글
[백준 1449 / JAVA] 수리공 항승 (0) | 2024.01.16 |
---|---|
[백준 4796 / JAVA] 캠핑 (0) | 2024.01.16 |
[백준 1018 / JAVA] 체스판 다시 칠하기 (0) | 2024.01.16 |
[백준 2503 / JAVA] 숫자 야구 (1) | 2024.01.15 |
[백준 10448 / JAVA] 유레카 이론 (1) | 2024.01.15 |