알고리즘

6. 없는 숫자 더하기 (JavaScript)

프잘백 2022. 1. 14. 19:51
728x90

문제 설명

0부터 9까지의 숫자 중 일부가 들어있는 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • 1 ≤ numbers의 길이 ≤ 9
  • 0 ≤ numbers의 모든 수 ≤ 9
  • numbers의 모든 수는 서로 다릅니다.

 

입출력 예시

 

 

나의 풀이

1) 실패

function solution(numbers) {
        var a = 0;
    for(let i=0; i<10; i++){
    a = numbers.indexOf(i);  //.indexOf(n) : 배열에서 n을찾아 몇번째 값인지 출력한다. 배열에 존재하지않으면 -1출력
        if(a==-1){
            var aaa = []; // 리스트 선언이 반복문 안에 있으므로 반복 되면서 리셋 된다.
            aaa.push(i);  // .push(a) : a를 리스트에 추가한다.
        }
    }
    const summary = (x, z) => x + z;
    return aaa.reduce(summary);
}

 

배열 선언을 반복문 안에 해서 없는 숫자중 가장 큰숫자만 summary안에 들어가서 실패

 

2) 성공

 

function solution(numbers) {
    var a ;      // 변수 선언
    var aaa = [];   // 배열 선언
    for(let i=0; i<10; i++){
        a = numbers.indexOf(i);  //.indexOf(n) : 배열에서 n을찾아 몇번째 값인지 출력한다. 배열에 존재하지않으면 -1출력
            if(a==-1){
                aaa.push(i);  // .push(a) : a를 배열에 추가한다.
            }
        }
    const summary = (x, z) => x + z; //합계 함수 만들기 ★reduce★
    return aaa.reduce(summary); // 합계 출력
}

 

 

모범 답안

 

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

 

나도 처음엔 이렇게 접근했는데 정석대로 풀고싶었다!

 

 

 

 

reduce

 


.reduce( )에 대해 더 알아보고 싶다.

 

 

arr.reduce(callback[, initialValue])

  • callback : 배열의 각 요소에 대해 실행할 함수. 다음 네 가지 인수를 가짐
    • accumulator : 누산기. 콜백의 반환값을 누적. 콜백의 이전 반환값 또는, 콜백의 첫 번째 호출이면서 initialValue를 제공한 경우에는 initialValue의 값임
    • currentValue : 처리할 현재 요소
    • currentIndex (Optional) : 처리할 현재 요소의 인덱스. initialValue를 제공한 경우 0, 아니면 1부터 시작
    • array (Optional) : reduce()를 호출한 배열
  • initialValue (Optional) : callback의 최초 호출에서 첫 번째 인수에 제공하는 값. 초기값을 제공하지 않으면 배열의 첫 번째 요소를 사용. 빈 배열에서 초기값 없이 reduce()를 호출하면 오류 발생

 

★누적값이기 때문에 다양하게 활용할 수 있다.

 

예를 들어보자.

→배열에 속해 있는 수를 [음수의 개수, 양수의 개수] 형식으로 나타낸다. 

 

const numbers = [2, -5, -123, 59, -5480, 24, 0, -69, 349, 3];
const result = numbers.reduce((acc, cur, idx) => { 
  if(cur < 0){  // 처리할 현재 요소가 음수일 경우
    acc[0]++;
  }
  else if(cur > 0){  // 처리할 현재 요소가 양수일 경우
    acc[1]++;
  }
  return acc;
 }, [0,0]);
console.log(result);  // [4, 5]

배열 numbers의 모든 요소에 대해 reduce() 함수를 실행한 결과는 다음과 같다.

 

 

각각 음수를4개, 양수를 5개 카운트 했다.

reduce는 정말 무궁무진 하다..