알고리즘 문제 풀기 (JS입문) - 없는 숫자 더하기

2023. 1. 6. 14:46알고리즘 공부

728x90
SMALL

문제

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


제한사항

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

입출력 예

 

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

 

function solution(numbers) {
    var answer = -1;
    return answer;
}

 

 

내가 푼 답

function solution(numbers) {   
    let arr1 = [1,2,3,4,5,6,7,8,9,0]
    let result = arr1.filter(x => !numbers.includes(x))
    let answer = result.reduce(function add(sum, currValue) {
        return sum + currValue;
});
  
     return answer
}

1. 0-9까지 들어있는 배열을 만든다.

2. numbers와의 차집합을 구한다.

3. 차집합으로 나온 요소들의 합을 구한다.

 


 

다른 사람이 푼 답1

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

 

 

우선 여기서 쓰인 reduce에 대해서 알아보는게 좋을 것 같다.

Array.reduce()의 기본 정리

: 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환한다.

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

 

이제 다른 사람이 풀었던 코드1의 리턴한 부분을 다시 살펴보자면,

return 45 - numbers.reduce((cur, acc) => cur + acc, 0);
return 0부터 9까지 모든 수의 합 - numbers.reduce(( 처리할 현재 요소, 누산기) => 처리할 현재 요소 + 누산기, 첫 번째 인수에 제공하는 값);

 

우선 45는 0부터 9까지 모든 수의 합이다.
numbers는 제시된 숫자들의 배열이고
reduce를 통해 배열의 모든 수를 더한 합을 구했다.

그럼  45 - 배열속 숫자의 합 을 리턴하라는  코드이다.

 

내 풀이의 경우 numbers가 0부터9까지 나온 배열보다 작거나 같을 것이기때문에,
0부터 9까지를 배열로 만들고 numbers에 들어있는 숫자를 빼주고(차집합) 남은 숫자들의 합을 구하는 방식으로 접근했는데
위 코드처럼 두 배열 각자 합을 구한 후 빼줘도 좋을 듯 하다.

 

  • 참고한 사이트 
 

[Node.js] javascript: Array.reduce() 사용 방법 정리

Array.reduce() ● 기본 정리 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환합니다. arr.reduce(callback[, initialValue]) callback : 배열의 각 요소에 대해 실행할 함수.

miiingo.tistory.com

Reduce에 대한 기본 정리 및 예시를 통한 사용 방법이 자세하게 나와있다.
이 메소드를 처음 접하는 사람이 보기에 깔끔하게 잘 나와있는것 같다.
또한 단순 코드구성만 알려주는게 아니라 예시 코드를 통해 해석을 해주다보니 나와 같은 초보자들에게 꼭 보라고 권하고 싶다. 

 


 

다른 사람이 푼 답2

function solution(numbers) {
    let answer = 0;

    for(let i = 0; i <= 9; i++) {
        if(!numbers.includes(i)) answer += i;
    }

    return answer;
}

위 코는 includes라는 메소드를 사용했다.

 

 

Array.inculdes()의 기본 정리

: 배열이 특정 요소를 포함하고 있는지 판별합니다.

  arr.includes(valueToFind[, fromIndex])
  • valueToFind
    탐색할 요소.> 참고: 문자나 문자열을 비교할 때, includes()는 대소문자를 구분합니다.

  • fromIndex Optional이 배열에서 searchElement 검색을 시작할 위치입니다. 음의 값은 array.length + fromIndex의 인덱스를 asc로 검색합니다. 기본값은 0입니다.


이제 다시 풀이를 보자면,

 for(let i = 0; i <= 9; i++) {
        if(!numbers.includes(i)) answer += i;
    }

    return answer;

for문으로 0부터 9까지 돌린다.
그리고 if문으로 조건을 주는데, !number.includes( i )  는 i를 number와 비교했을 때 아닌 값을 ture로 반환하고.
그 값을 anwer에 더하면서 넣어준다. 그리고 answer를 답을 리턴했다.

코드를 풀이 하자면 이런 뜻이 될 것 같다.
영어를 직역한것 마냥 문장이 좀 이상하지만 뜻이 잘 전달되기만 하면....된것 같다ㅎㅎ

 

 

참고사이트

 

Array.prototype.includes() - JavaScript | MDN

includes() 메서드는 배열이 특정 요소를 포함하고 있는지 판별합니다.

developer.mozilla.org

mdn에 다양한 정보가 나와있으니 참고하면 좋을 듯 하다.


 

 

이 문제를 끝으로 당분간은 알고리즘 문제를 풀지 않을 것 같다.
항해99를 통해 리액트를 배우는 중인데, 새로운걸 습득하는 것이 어려워서
항해 99가 끝나면 조금씩 풀어나가면서 문제해결 방법을 습득하고 메소드, 함수등을 익혀나가도록 해야겠다.

 

항해99를 고민하고 계시는 분이 있다면 댓글 남겨주세요 :)

728x90
LIST