Algorithm

[Algorithm] 없는 숫자 더하기

sod0l 2024. 9. 13. 12:13

1. 문제 개요

  • 문제 제목: 없는 숫자 더하기
  • 문제 설명: 0부터 9까지 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어진다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.
문제 해설
주어진 배열 `numbers`에는 0부터 9까지의 숫자 중 일부가 들어있다. 예를 들어, `numbers`의 배열이 `[1, 3, 5]`라면 1, 3, 5가 포함되어 있다는 의미이다.

이 문제에서 우리가 해야 할 일은 다음과 같다.
1. 0부터 9까지의 모든 숫자 중에서 배열 `numbers`에 없는 숫자들을 찾는다.
2. 그런 다음, 이 없는 숫자들의 합을 계산한다.

예를 들어, 만약 `numbers` 배열이 `[1, 3, 5]`라면, 0, 2, 4, 6, 7, 8, 9가 배열에 없는 숫자들이다. 이 숫자들을 모두 더한 값이 문제의 답이 된다.

 

 

2. 문제 해결 전략

  • 단계 1: 0부터 9까지의 모든 숫자의 합을 구한다. 이 합은 45이다.
  • 단계 2: 주어진 배열 `nubmers`에 있는 숫자들의 합을 구한다.
  • 단계 3: 전체 합(45)에서 `nubmers` 배열의 합을 빼면, 배열에 없는 숫자들의 합이 나온다. 이 값을 반환한다.
단계별 추가 설명
1. 모든 숫자들의 합 구하기:
0부터 9까지의 숫자들을 모두 더한 값은 45이다. 이 값은 `0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9`를 계산하여 얻은 값이다.

2. 배열에서 숫자들의 합 구하기:
주어진 배열 `numbers`에 있는 숫자들을 모두 더한다. 예를 들어, 배열이 `[1, 3, 5]`라면 이 숫자들의 합은 `1 + 3 + 5 = 9`이다.

3. 전체 합에서 배열의 합을 빼기:
전체 숫자의 합인 45에서 배열의 합을 뺀다. 이 차이값이 배열에 없는 숫자들의 합이 된다. 에를 들어, `45 - 9 = 36`이 된다. 이는 배열에 없는 숫자들의 합이다. 

 

 

3. 코드 분석

function solution(numbers) {
    // 0부터 9까지의 모든 숫자의 합은 45이다. (0+1+2+...+9)
    const totalSum = 45;
    
    // numbers 배열에 있는 숫자들의 합을 구한다.
    const numbersSum = numbers.reduce((acc, curr) => acc + curr, 0);
    
    // 전체 합에서 numbers 배열에 있는 숫자들의 합을 뺀 값이 없는 숫자들의 합을 구한다.
    var answer = totalSum - numbersSum;
    
    return answer;
}
  • `numbers`: 배열입니다. 예를 들어 [1, 2, 3, 4, 5]일 수 있다.
  • `(acc, curr) => acc + curr`: 누적 함수입니다.
    • `acc`: `accumulator`를 의미한다. `reduce()`가 배열을 순회하면서 유지하는 누적값이다. 초기값으로 `0`이 설정되기 때문에, 첫 번째 호출에서 `0`이 `acc` 의 값이 된다.
    • `curr`: `currentValue`를 의미한다. 배열의 현재 요소이다. 예를 들어, 배열이 `[1, 2, 3 ,4, 5]`일 때, 첫 번째 호출에서는 `1`, 두 번째 호출에서는 `2`, 그 다음 호출에서는 `3`등의 값이 된다.
    • `acc + curr`: 현재까지의 누적값(`acc`)에 배열의 현재 요소 (`currr`)를 더하는 연산이다.
  • `0`: `initialValue`이다. `reduce()` 메소드가 시작할 때 사용하는 초기값이다. 이 경우 `0`으로 설정되어 있으므로, `acc`는 처음에 `0`으로 시작한다.
단계별 추가 설명
1. 초기값 설정: acc는 0으로 설정된다.
2. 첫 번째 호출: acc = 0, curr = 1acc + curr → 0 + 1 → 1이 새로운 acc값이 된다.
3. 두 번째 호출: acc = 1, curr = 2acc + curr → 1 + 2 → 3이 새로운 acc값이 된다.
4. 세 번째 호출: acc = 3, curr = 3acc + curr → 3 + 3 → 6이 새로운 acc값이 된다.
5. 이 과정을 배열의 모든 요소에 대해 반복: 마지막 호출에서는 acc와 curr이 배열의 마지막 요소와 더해지며 최종 결과가 된다.

- 배열의 모든 요소가 순회되면서 acc에 curr을 계속 더한다.
- 최종적으로 모든 요소를 더한 값이 numbersSum에 저장된다.

3-1) 메소드 및 함수 설명

  • 메소드/함수 이름: `reduce()`
    • 용도: 배열의 모든 요소를 누적하여 단일 값으로 줄인다.
    • 설명: 배열의 각 요소를 순회하며, 누적값(acc)과 현재값(curr)을 합산하여 결과를 반환한다.
    • 사용 예: `numbers.reduce((acc, curr) => acc + curr, 0)`은 배열 `numbers`의 모든 요소를 더하여 총합을 구한다.

 

3-2) 코드 분석 부분

  • 중요 코드 부분:
const numberSum = numbers.reduce((acc, curr) => acc + curr, 0);

 

  • 설명: `reduce()` 메소드를 사용하여 배열 `numbers`의 모든 요소를 더한 값을 계산한다. `acc`는 누적된 값이며, `curr`은 현재 배열의 요소이다.
  • 장점: `reduce()`를 사용하여 배열의 모든 요소를 간결하게 한 줄로 누적 계산할 수 있다. 코드가 짧고 직관적이며, 배열의 합을 효율적으로 구할 수 있다.

 

 

4) 코드의 역할 및 활용

4-1) 코드의 역할

  • 배열 `numbers`에 있는 숫자들을 제외한 나머지 숫자들의 합을 구한다. 이 과정에서 0부터 9까지의 모든 숫자 중 배열에 없는 숫자를 찾고, 그 숫자들의 합을 계산하여 반환한다.

 

4-2) 적용 예시

  • 이 코드의 방식은 다양한 문제에서 숫자 합계를 계산할 때 유용하다. 예를 들어, 특정 범위의 숫자 중 누락된 값을 찾거나, 숫자의 합계가 필요한 문제에 적용할 수 있다. 게임 점수 계산이나 통계 분석에서 사용될 수 있다.