코딩 테스트

[프로그래머스/JS] 없는 숫자 더하기

jhlee_ 2022. 8. 23. 09:19

링크

https://school.programmers.co.kr/learn/courses/30/lessons/86051

문제 설명

- 0부터 9까지 중 숫자 일부가 들어있는 정수 배열 numbers, 매개변수로 주어짐
- numbers에서 찾을 수 없는 0부터 9까지 숫자를 모두 더해 return
- numbers의 모든 원소는 서로 다름

내가 푼 방법

0부터 9까지 온전히 있는 배열과 주어진 배열 numbers을 비교
있는 수를 제거한 없는 것만 걸러내고 합하면 될 것 같았다.

function solution(numbers) {
    let answer = 0
    const allNums = Array.from(Array(10).keys()) // 1️⃣
    const notIncludedNums = allNums.filter((x) => !numbers.includes(x)) // 2️⃣
    notIncludedNums.map(x =>  answer += x) // 3️⃣
    return answer
}

 

1️⃣ 0부터 9까지 담긴 배열 allNums 만들고 
2️⃣ 배열 allNums에서 numbers에 포함되지 않은 숫자를 filter하여 notIncludedNums에 넣기
3️⃣ notIncludedNum를 다시 순회하며 그 합을 구한뒤 return answer

다른 풀이 방법

function solution(numbers) {
    return 45 - numbers.reduce((cur, acc) => cur + acc, 0);
}

이렇게도 풀수 있구나 충격. 덧셈을 말했는데 뺄셈으로 생각해서 쉽게 풀어냈다니 놀라웠음.

numbers result
[1,2,3,4,6,7,8,0] 14

위 표와 같은 조건이 주어졌을때 numbers에 없는 수를 찾아 더하라고 했으니
numbers에서 없는 수 : 5, 9
result : 14
0부터 9까지 더한 수 45에서 numbers의 숫자 합(1+2+3+4+6+7+8+0 = 31)을 빼면, 없는 수의 합(result값 14)이 나올 것이다.

배운 점 

for문을 사용하지 않고, 0부터 10의 숫자를 넣어 풀고 싶었다.
Array() 생성자를 사용해서 만들었는데 이 과정에서 new Array()사용을 지양되는 이유를 알게되었다.

const a = new Array() // never use
const b = new Array(1,2,3) // never use

const c = new Array("3") // ["3"]
const d = new Array(3) // [empty x 3]
// d는 length: 3인 빈 배열

const e = new Array(1.2) // Uncaught RangeError: Invalid array
const f = [1.2] // [1.2]

- new Array()를 호출 했을때 결과 자체는 []를 사용 했을 때와 동일
- 값이 Number인지 아닌지에 따라 값이 달라짐
- new Array(1.2)는 RangeError exception을 뱉어냄

 

느낀

또, 이 문제를 풀면서 차집합/교집합을 구하는 법을 보게 알게되었다.
사실 예전에 어느 코테에서 이 문제가 나온적 있었는데 못 풀었다. 정리하지 않고 그대로 넘어갔는데 다시 보게되는구나.
한번 정리해야겠다.

728x90