** 코드
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
39
40
41
42
43
44
45
46
47
48
49
50
51
|
package inflearn_8_dfs_bfs_uses;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
public class inflearn8_1 {
static int n,m,k;
static int[] arr;
static int total;
static StringTokenizer st;
static StringBuilder sb;
static Set<Integer> set;
static boolean[] visited;
static String min;
public static void main(String[] args)throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.parseInt(br.readLine());
arr = new int[n];
st = new StringTokenizer(br.readLine(), " ");
total=0;
for(int i=0; i<n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
total+=arr[i];
}
set = new HashSet<>();
min = "NO";
dfs(0, 0);
System.out.println(min);
br.close();
bw.close();
}
static void dfs(int start, int sum) {
if(sum>(total/2))return;
if(start>=n) {
if(total-sum==sum) {
min = "YES";
}
return;
}
dfs(start+1, sum+arr[start]);
dfs(start+1, sum);
}
}
|
cs |
한번 틀렸던 문제.
DFS를 통해 index의 레벨을 토대로 가지를 뻗어나갔고, 이를 다른 파라미터인 sum에 추가/현상유지를 진행했다.
이를 토대로 Set에 변수를 저장하여, 해당 값이 다시 나온다면 전역변수로 설정한 min을 "YES"로 설정했다.
1. 틀린 이유
- 문제 자체를 잘못 이해했다. 문제의 정답은 같은 값이 나오는 부분집합이 있을 때 "YES", 없을 때 "No"인 것이 아니라 "합이 같은 부분집합이 있다면" Result를 "YES"로 바꾸는 것이다.
- 따라서 중복된 값을 제거하기 위해 Set을 사용한 것도 전혀 무의미했고, 중복값이 나왔을때 "YES"로 설정한거 자체가 틀린 문제풀이였다.
2. 얻어 갈 점
- 합이 같은 부분집합이다? 그렇다면 Array 전체 요소의 값을 합한 것을 2로 나눈 값이 존재한다면 그런 부분집합이 존재한다는 생각을 하지 못했는데, 이러한 생각을 할 수 있다는 것을 배웠다.
- DFS의 단점 중 하나는 재귀함수의 특성상 정답을 찾았음에도 Stack Frame에 계속 메소드가 쌓여있다보니 가지치기를 하지 않는다면 불필요한 시간소모가 큰 점이다.
-> 이를 전역변수 boolean flag 를 세워 둔 후 정답을 찾는다면 이를 true로 바꾸고, 만약 flag가 true라면 이미 정답 값이 나온 것이니 모든 함수를 return 시키는 것으로 시간초과를 막을 수 있다는 것을 알 수 있었다.
'알고리즘 > 인프런(자바(Java) 알고리즘 문제풀이 입문' 카테고리의 다른 글
8-5 동전 교환 (1) | 2024.01.24 |
---|---|
8-2 송아지 태우기(DFS) (1) | 2024.01.24 |
6-4 Least Recently Used (0) | 2024.01.14 |
6-3 삽입정렬(Insert Sorting) (1) | 2024.01.14 |
5-8 응급실(Queue) (1) | 2024.01.09 |