AIL( Algorithm I Learned)

#AIL_23.11.18 // Programmers_자릿수 더하기

k0z 2023. 11. 18. 23:44

## AIL_자릿수 더하기 

***문제 설명
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

***제한사항
N의 범위 : 100,000,000 이하의 자연수

***입출력 예
N answer
123 6
987 24

***입출력 예 설명
입출력 예 #1// 문제의 예시와 같습니다.
입출력 예 #2 // 9 + 8 + 7 = 24이므로 24를 return 하면 됩니다.

## solution.JavaScript

1. 문제의 접근 방식

주어진 문제는 숫자를 문자열로 변환하고, 각 자릿수를 분해한 후, 각 자릿수를 정수형으로 변환하여 총합을 계산하는 방법입니다.  


2. 문제풀이

function solution(n) {
    let nStr = n.toString().split("").map(Number)
    let sum = 0;

    for (let i = 0; i < nStr.length; i++) {
        sum += nStr[i]
    }

    return sum
}
/*
테스트 1
입력값 〉	123
기댓값 〉	6
실행 결과 〉	테스트를 통과하였습니다.
테스트 2
입력값 〉	987
기댓값 〉	24
실행 결과 〉	테스트를 통과하였습니다.
*/

 

1. `n`을 `toString()` 메서드를 사용하여 문자열로 변환합니다. 이렇게 하면 각 자릿수에 쉽게 접근할 수 있습니다. 

 

2. 문자열로 변환된 `n`을  `split("")`을 사용하여 각 자릿수를 배열로 분리합니다.

(`n.toString().spl)it("")`)

 

3. `map(Number)`를 사용하여 각 문자열을 숫자로 변환합니다.

 

4. 반복문을 사용하여 `nStr`을 순회합니다. 반복문에서는 `parseInt()`함수를 사용하여 각 자릿수를 정수로 변환하고, 이 값을 `sum` 변수에 더해 자릿수의 합을 계산합니다.

 

4. 마지막으로, 계산된 합인 `sum`을 반환하여 각 자릿수의 합을 구합니다. 


3. 다른사람의 문제풀이 및 접근방식 분석

function solution(n) {
    return String(n) // 주어진 숫자를 문자열로 변환
        .split("") // 각 자릿수를 배열로 분리
        .reduce((acc, curr) => acc + Number(curr), 0); // 각 자릿수를 순회하며 총합 계산
}
/*
테스트 1
입력값 〉	123
기댓값 〉	6
실행 결과 〉	테스트를 통과하였습니다.
테스트 2
입력값 〉	987
기댓값 〉	24
실행 결과 〉	테스트를 통과하였습니다.
*/

 

1. `String(n)`을 사용하여 입력된 자연수 `n`을 문자열로 변환합니다. 이렇게 하면 각 자릿수에 쉽게 접근할 수 있습니다. 

 

2. `split("")`을 사용하여 문자열을 각 자릿수 별 배열로 분리합니다. 이 때, 각 문자는 배열의 요소로 변환됩니다. 

 

3. `reduce()`를 사용하여 배열의 각 요소를 순회합니다. 초기값 `0`으로 시작하여 배열의 각 요소를 숫자로 변환한 뒤, 이전까지의 누적 값에 더합니다. 

** `acc`은 누적값을 나타내며, `curr`은 현재 배열 요소를 나타냅니다. 

** 'Number(curr)'을 통해 각 문자열 요소를 숫자로 변환하고, `acc + Number(curr)`를 통해 누적된 값을 갱신합니다. 

 

쉽게 정리하면 위 방법은 문자열 변환 후 배열로 분리하여 각 자릿수를 더하는 것으로 `reduce()` 메서드를 잘 사용한 예시라고 볼 수 있습니다. 


# String()과 toString()의 차이점 

*** `String()` 함수

** `String()` 함수는 JavaScript의 전역 함수입니다. 

** 모든 데이터 타입을 문자열로 변환합니다. 

** 어떤 값을 문자열로 바꾸고 싶을 때 사용됩니다. 

 

예시)

let num = 123;
let strNum = String(num); // "123"

let bool = true;
let strBool = String(bool); // "true"

*** `toString()` 메서드

** `toString() `은 JavaScript의 모든 객체가 가지고 있는 메서드입니다. 

** 위 메서드는 해당 객체를 나타내는 문자열을 반환합니다.

** 기본데이터 타입(숫자, 문자열, 불리언)을 객체로 변환한 경우에도 `toString()` 메서드를 사용할 수 있습니다. 

 

예시)

let num = 123;
let strNum = num.toString(); // "123"

let arr = [1, 2, 3];
let strArr = arr.toString(); // "1,2,3"

=>>> ***간단 정리

`String()` 함수는 어떤 값이든 문자열로 변환하고 싶을 때 사용하며, `toString()` 메서드는 객체에서 해당 객체를 나타내는 문자열을 얻고자 할 때 사용합니다. 대부분의 경우, 숫자, 문자열 또는 불리언 값에 `toString()` 메서드를 직접 사용하지 않고, `String()`  함수를 사용하는 것이 더 편리하고 명확합니다.


# reduce() 메서드란?

`reduce()`메서드는 배열의 각 요소를 이용하여 하나의 결과값을 도출하는데 사용됩니다. 이 메서드는 네 가지의 매개변수를 받아 동작합니다. 

 

*** 콜백함수

`reduce()`메서드의 가장 중요한 매개변수로, 배열 요소마다 호출되는 함수입니다. 이 함수는 4가지 매개변수를 받습니다.

 

1. `accumulator`(누적기)

누적된 결과를 저장하는 변수로, 콜백 함수의 반환값이 여기에 누적됩니다. 

 

2. `currentValue`(현재 값)

배열에서 처리 중인 현재 요소의 인덱스입니다. 

 

3. `currentIndex`(현재 인덱스,선택적)

현재 처리중인 요소의 인덱스입니다. 

 

4. `array`(배열, 선택적)

`reduce()`를 호출한 배열 자체입니다. 


*** 초기값(Initial Value, 선택적)

초기값을 제공하는 매개변수입니다. 초기값을 지정하지 않으면 배열의 첫 번째 요소가 사용됩니다. 배열이 비어있는 경우 초기값이 없으면 오류를 발생시킵니다. 


*** `reduce()` 메서드의 동작

1. `reduce()`는 배열의 첫 번째 요소부터 마지막 요소까지 순차적으로 순회합니다. 

 

2. 콜백 함수가 각 요소에 대해 호출되며, 첫 번째 호출시에는 초기값 또는 배열의 첫 번째 요소가 `accumulator`에 할당됩니다. 

 

3. 콜백 함수가 반환하는 값은 다음 순회에 사용될 `accumulator`가 됩니다. 

 

4. 모든 요소를 순회한 후, `reduce()`는 최종적으로 누적된 결과를 반환합니다.

 

예시)

let numbers = [1, 2, 3, 4, 5];

let sum = numbers.reduce((accumulator, currentValue) => {
    return accumulator + currentValue;
}, 0);

console.log(sum); // 출력 결과: 15 (1 + 2 + 3 + 4 + 5)

 

위 코드에서 `reduce()` 메서드는 초기값을 0으로 설정하고 배열의 모든 요소를 더하여 총합을 계산합니다. 이때 각 요소는 콜백 함수에 의해 누적되고, 최종적으로 총합 15를 반환합니다.