링크
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을 뱉어냄
느낀 점
또, 이 문제를 풀면서 차집합/교집합을 구하는 법을 보게 알게되었다.
사실 예전에 어느 코테에서 이 문제가 나온적 있었는데 못 풀었다. 정리하지 않고 그대로 넘어갔는데 다시 보게되는구나.
한번 정리해야겠다.
'코딩 테스트' 카테고리의 다른 글
[프로그래머스/JS] 세균증식 (0) | 2022.10.03 |
---|---|
[프로그래머스/JS] 같은 숫자는 싫어 (0) | 2022.09.27 |
[프로그래머스/JS] x만큼 간격이 있는 n개의 숫자 (0) | 2022.08.16 |
[프로그래머스/JS] 부족한 금액 계산하기 (0) | 2022.08.12 |
[프로그래머스/JS] 내적 (0) | 2022.07.30 |