N개의 원소로 구성된 자연수 집합이 주어지면, 이 집합을 두 개의 부분집합으로 나누었을 때
두 부분집합의 원소의 합이 서로 같은 경우가 존재하면 “YES"를 출력하고, 그렇지 않으면
”NO"를 출력하는 프로그램을 작성하세요.
둘로 나뉘는 두 부분집합은 서로소 집합이며, 두 부분집합을 합하면 입력으로 주어진 원래의
집합이 되어 합니다.
예를 들어 {1, 3, 5, 6, 7, 10}이 입력되면 {1, 3, 5, 7} = {6, 10} 으로 두 부분집합의 합이
16으로 같은 경우가 존재하는 것을 알 수 있다.
Input | Output |
---|---|
[1,3,5,6,7,10] | YES |
1
이면 sum
변수에 합한다.sum
이 문제에서 주어진 배열의 총 합의 1/2
면, 집합에 포함된 숫자들의 합과 포함되지 않은 숫자들의 합이 같다는 것을 알 수 있다. 따라서 두 집합은 서로소 집합이다.const solution = (nums) => {
let answer = "NO";
let flag = 0;
const check = new Array(nums.length);
check.fill(1);
const total = nums.reduce((acc, cur) => acc + cur, 0);
const DFS = (dt) => {
if (flag) return;
if (dt === nums.length + 1) {
let sum = 0;
for (let i = 0; i < check.length; i++) {
if (check[i] === 1) {
sum += nums[i];
}
}
if (sum * 2 === total) {
answer = "YES";
flag = 1;
}
} else {
check[dt] = 1;
DFS(dt + 1);
check[dt] = 0;
DFS(dt + 1);
}
};
DFS(1);
return answer;
};