알고리즘🅰/프로그래머스

[프로그래머스] 없는 숫자 더하기 (교집합, 차집합)

개발조각 2022. 2. 8. 16:46
728x90
반응형

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;
}

"없는 숫자 더하기" 문제

  1. number의 변수를 만들어 0~9까지 숫자를 배열로 담기
  2. number배열에서 numbers의 배열에 있는 숫자를 없애서 numbers에 배열에 없는 숫자만을 noNum배열에 담기
  3. 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를 써주어서 배열의 원소의 합을 구하고 빼주면

없는 숫자의 합이 나오겠죠?

 

이렇게 또 하나 배워갑니다.!!😤

그래도 교집합, 차집합 사용방법을 알게 돼서 기분 좋습니다~

728x90
반응형