작성
·
280
0
강의 듣기 전, 혼자 풀어볼 때 코드를 이렇게 짰는데 이것도 맞는 풀이일까요 ...?
import java.util.*;
import java.io.*;
/*
N개의 원소로 구성된 자연수 집합이 주어지면, 이 집합을 두 개의 부분집합으로 나누었을 때
두 부분집합의 원소의 합이 서로 같은 경우가 존재하면 “YES"를 출력하고, 그렇지 않으면 ”NO"를 출력하는 프로그램을 작성하세요.
둘로 나뉘는 두 부분집합은 서로소 집합이며, 두 부분집합을 합하면 입력으로 주어진 원래의 집합이 되어 합니다.
예를 들어 {1, 3, 5, 6, 7, 10}이 입력되면 {1, 3, 5, 7} = {6, 10} 으로 두 부분집합의 합이 16으로 같은 경우가 존재하는 것을 알 수 있다.
ex.
6
1 3 5 6 7 10
-> YES
*/
public class P01_합이같은부분집합_DFS_아마존인터뷰 {
static int total;
static int[] arr;
static String answer;
static int index;
static int sum;
static int N;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
total = 0;
for (int i=0; i<N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
total += arr[i];
}
index = 0;
sum = 0;
answer = "NO";
DFS(index);
System.out.println(answer);
}
public static void DFS(int index) {
if (sum*2 > total || index==N) {
return;
} else {
sum += arr[index];
if (sum*2 == total) {
answer = "YES";
return;
}
DFS(index+1);
sum -= arr[index];
DFS(index+1);
}
}
}
채점 사이트에서 통과하기는 하는데 이 풀이가 맞아서 통과한건지 아님 운좋게(?) 테스트 케이스 5개가 다 맞아서 통과한건지 뭔가 풀이에 대한 확신이 없어서요 .. !