프로그래머스 레벨1 - 없는 숫자 더하기(자바스크립트)
https://school.programmers.co.kr/learn/courses/30/lessons/86051
문제
0부터 9까지의 수 중에 일부가 배열로 저장되어 있고 그 배열에서 빠진 숫자를 찾는 문제이다.
일단 빠진 수를 찾으려면 배열을 순회해야만 한다.
for문을 사용할 수도 있지만 최근에 공부한 es6함수인 filter를 사용하여 좀 더 있어보이게(?) 코딩을 해야겠다는 생각을 했다.
제한사항
배열 n은 0부터 9 사이의 수이고 중복된 숫자는 들어가지 않는다.
한마디로 별다른 조건 줄 필요없이 편하게~ 반복문을 돌리면 된다는 소리다.
답
function solution(numbers) {
var answer = 45; //0부터 9까지 모두 더한 변수 answer을 생성.
numbers.filter(x => answer -= x); //answer에서 number에 있는 수들의 합을 뺀다.
return answer;
}
filter함수는 배열의 각 값들 중에서 조건에 만족하는 값들만 뽑아오는 함수이다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
number에 존재하는 숫자들을 answer에서 모두 빼주었다.
answer는 0부터 9까지 숫자를 모두 합한 값이기 때문에 number의 값을 모두 빼주면 결국 number에 없는 숫자들의 합이 된다.
비교
reduce함수를 사용해 더 간단하게도 코딩할 수 있다는 사실을 알았다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
arr.reduce(callback, initialValue)
쉽게 말해 배열의 초기값과 콜백값을 받아서 조건을 줄 수 있는 함수다.
reduce의 가장 쉬운 이해 예시는 모든 배열의 합이다.
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const sum1 = numbers.reduce((accumulator, currentNumber) => accumulator + currentNumber);
acc에는 콜백된 값이 넘어오고 current에는 최초 콜백함수 실행 시 적용되는 값이 들어간다. 빈 배열이거나 초기값이 없을 경우에는 에러가 발생한다.
위 배열의 경우 초기값이 1이기 때문에 current에 1이 들어간 채 콜백이 되며 배열의 순서대로 숫자를 더해가는 방식이다.
위 함수를 사용하면
45 - numbers.reduce((cur, acc) => cur + acc, 0);
이렇게 한줄로도 구현이 가능했다!
훨씬 직관적이고 깨끗하다.
그 외에 includes 함수를 사용하여 numbers 배열에 포함되지 않는 수를 더하는 조건을 줘도 됐다.
나는 뭔가 배운 filter을 사용하기 위해 억지로 쓰려고 한 것도 없지 않아 있는데 사실 다른 함수로도 얼마든지 구현이 가능하다는 것을 알았다.
총평
reduce, includes 복습.
쉬운 코딩 문제도 쓰는 함수에 따라 보기도 깔끔하고 성능적으로도 훨씬 우수하게 코딩이 가능하다!