[DFS] 1. 합이 같은 부분집합
by 개발하는지호<<풀이>>
-나의 풀이-
우선 나의 풀이는 틀렸따 ㅋㅋㅋ 나름 잘 했다고 생각했지만, 시도는 좋았다고 생각한다. 어떤 부분에서 문제가 있을 거 같은데, 시간 상 아직 체크를 하지 못했다.
import java.util.Scanner;
class Main{
private static int[] arr;
private static int[] ch;
private static int sum;
private static int target;
private String DFS(int v) {
sum += v;
for (int x : arr) {
if (ch[x] != 1) {
target += x;
}
}
if (sum == target) return "YES";
else {
target = 0;
for (int x : arr) {
if (ch[x] != 1) {
ch[x] = 1;
DFS(x);
sum -= x;
ch[x] = 0;
}
}
}
return "NO";
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
arr = new int[n];
ch = new int[11];
for (int i = 0; i < n; i++) {
arr[i] = in.nextInt();
}
ch[arr[0]] = 1;
System.out.println(T.DFS(arr[0]));
}
}
-강사님 풀이-
크 ~ 이 문제도 기가막히게 푸셨다. 나도 이런 풀이는 알고는 있었지만, 떠오르지 못했다.. ㅠ
일단 전체적인 맥락은 사용하거나 사용 안 하거나 이렇게 두 가지로 나눠서 진행을 했다.
그리고 return 타입도 void로 해서 진행을 했다.
이후, 값이 total 값에 sum을 빼거나 total을 2로 나눴을 때 값이 sum과 같다면 answer에 "YES" 를 출력하게 했다.
answer가 "YES"가 되는 순간 부터는 더 이상 계산이 필요가 없기 때문에 flag 를 false로 해둔 것을 true로 바꿈으로써
계속 return이 되도록 하여, 계산을 끝내도록 했다.
import java.util.Scanner;
class Main {
static String answer = "NO";
static int n, total = 0;
boolean flag = false;
public void DFS(int L, int sum, int[] arr) {
if (flag) return;
if (sum > total / 2) return;
if (L == n) {
if ((total - sum) == sum) {
answer = "YES";
flag = true;
}
}
else {
DFS(L + 1, sum + arr[L], arr);
DFS(L + 1, sum, arr);
}
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
n = in.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = in.nextInt();
total += arr[i];
}
T.DFS(0, 0, arr);
System.out.println(answer);
}
}
참 코드가 많이 깔끔해졌다. 어떻게 보면 개념적으로 알고는 있지만 아직 내 것이 아니다보니 제대로 활용은 못한 거 같다.
지금은 이렇지만 점차 늘것이라 생각하고, 내 혼자 다시 코드 작성해서 풀어봐야겠다!
'코딩테스트' 카테고리의 다른 글
[DFS] 3. 최대점수 구하기 (1) | 2024.02.22 |
---|---|
[DFS] 2. 바둑이 승차 (70) | 2024.02.16 |
[BFS] 14. 그래프 최단 거리 (2) | 2024.02.10 |
[DFS] 13. 경로탐색(인접리스트, ArrayList) (2) | 2024.02.10 |
[DFS] 12. 경로탐색 (1) | 2024.02.08 |
블로그의 정보
DevSecOps
개발하는지호