[프로그래머스] 없는 숫자 더하기 (교집합, 차집합)
2021.09.17에 푼 문제입니다.
"없는 숫자 더하기" 문제 해결방안에 대해 설명하겠습니다.
이문제는 문제 설명 그대로 풀었습니다.

해결방안
function solution(numbers) {
let number = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let noNum = number.filter(num => !numbers.includes(num));
let answer = noNum.reduce((acc, cur) => acc + cur);
return answer;
}
"없는 숫자 더하기" 문제는
- number의 변수를 만들어 0~9까지 숫자를 배열로 담기
- number배열에서 numbers의 배열에 있는 숫자를 없애서 numbers에 배열에 없는 숫자만을 noNum배열에 담기
- noNum배열에 있는 숫자 더하기
이러한 순서로 풀었습니다.
1. number의 변수를 만들어 0~9까지 숫자를 배열로 담기
let number = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
"0부터 9까지의 숫자 중 일부가 들어있는 배열 numbers가 매개변수로 주어집니다."라는 문장을 보고 number의 변수를 만들어 0~9까지 숫자를 배열로 담아주었습니다.
2. number배열에서 numbers의 배열에 있는 숫자를 없애서 numbers에 배열에 없는 숫자만을 noNum배열에 담기
let noNum = number.filter(num => !numbers.includes(num));
MDN Web Docs
filter() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.
구문 : 배열.fliter((요소인덱스)=> 조건);
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter(word => word.length > 6);
console.log(result); // Array ["exuberant", "destruction", "present"]
MDN Web Docs
includes() 메서드는 배열이 특정 요소를 포함하고 있는지 판별합니다.
구문 : 배열.includes(탐색할 요소, 위치)
- 위치는 생략가능하고 기본값은 0입니다.
const array1 = [1, 2, 3];
console.log(array1.includes(2)); // true
console.log(array1.includes(2, 0)); // true (array1.includes(2)와 같은 표현)
console.log(array1.includes(2, 1)); // true (현재 인덱스 1번 위치에 있기 때문에)
console.log(array1.includes(2, 2)); // false
filter(), includes() 이 두 가지를 사용하여 number, numbers 배열에 대한 차집합을 구했습니다.
저도 처음 알았는데 이 두가지 메서드를 사용하면 두 배열의 교집합과 차집합을 구할 수 있습니다.
(검색해서 알게 되었습니다.!!)
filter(), includes()를 사용하여 교집합과 차집합을 구하는 예시

arr1 = [1,2,4,5,7];
arr2 = [3,4,7,9];
const test1 = arr1.filter(num => arr2.includes(num));
const test2 = arr1.filter(num => !arr2.includes(num));
const test3 = arr2.filter(num => !arr1.includes(num));
console.log(test1); // 교집합 [4,7] -> C
console.log(test2); // 차집합 [1,2,5] -> A
console.log(test3); // 차집합 [3,9] -> B
테스트1 : noNum = [5, 9]
테스트2 : noNum = [1, 2, 3]
3. noNum배열에 있는 숫자 더하기
let answer = noNum.reduce((acc, cur) => acc + cur);
MDN Web Docs
reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.
reduce() 함수는 네 개의 인자를 가집니다.
1. 누산기 (acc)
2. 현재 값 (cur)
3. 현재 인덱스 (idx)
4. 원본 배열 (src)
구문 : 배열.reduce((callback)=>처리할 현재 요소, 기본값)
- callback : 배열의 각 요소에 대해 실행할 함수. 다음 네 가지 인수(acc, cur, idx, src)를 받습니다.
- 기본값 : 넣어도 되고 안 넣어도 됨
const array1 = [1, 2, 3, 4];
const reducer = (previousValue, currentValue) => previousValue + currentValue; // 1 + 2 + 3 + 4
console.log(array1.reduce(reducer)); // 10
- reduce((0, 1) => 0 + 1); // 1
- reduce((1, 2) => 1 + 2); // 3
- reduce((3, 3) => 3 + 3); // 6
- reduce((6, 4) => 6 + 4); // 10
reduce() 메서드는 자주 사용하니까 모르시는 분들은 꼭 알아두세요.
테스트1 : answer = 14
테스트 2 : answer = 6
프로그래머스 없는 숫자 더하기 해결방안 설명은 여기까지 입니다.
저는 이렇게 풀었는데
다른 사람 풀이를 보니까 "45 - number배열의 원소의 합"로 풀더라구요.
return 45 - numbers.reduce((cur, acc) => cur + acc, 0);
45는 0~9까지의 합이고
reduce를 써주어서 배열의 원소의 합을 구하고 빼주면
없는 숫자의 합이 나오겠죠?
이렇게 또 하나 배워갑니다.!!😤
그래도 교집합, 차집합 사용방법을 알게 돼서 기분 좋습니다~