자릿수 더하기(Javascript)

·2022년 9월 13일
0
post-thumbnail

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

제한사항

N의 범위 : 100,000,000 이하의 자연수

입출력 예

Nanswer
1236
98724

입출력 예 설명

입출력 예 #1
문제의 예시와 같습니다.

입출력 예 #2
9 + 8 + 7 = 24이므로 24를 return 하면 됩니다.

나의 풀이

나는 되게 복잡하게 풀었다...이 풀이가 너무 복잡한 것 같아서 그냥 다른 사람 풀이 참고하려고 빨리 풀었다. 이 풀이를 참고하지 말고 다른 사람 풀이를 참고하자

function solution(n)
{
  	let numToString = `${n}`
    //숫자를 문자로 변환, 숫자를 `${}`안에 넣어 줌. 
  	let divide = numToString.split('');
 	 //split은 문자를 구분자에 따라 분리해줌. 공백을 줬으므로 한 글자마다 분리
  	//split 안에는 반드시 ''를 넣어줘야 하고 "" 도 가능. 
    let StringToNum = divide.map((i) => Number(i));
  	//map을 사용해서 문자열 배열을 숫자 배열로 바꿔줌.
    let sum = StringToNum.reduce((a,b) => (a+b)); 
 	//reduce를 사용해서 배열을 전부 더해줌. 
  	//map으로 숫자로 바꿔주지 않으면 1+2+3 = 6이 아니라 123으로 결과값이 나옴. 
    return sum;
}

참고할 풀이1

이 방식은 기본적으로 내가 푼 방식과 유사한 듯 하다. 나는 습관적으로 변수를 전부 만들어 줬는데 짧게 쓰려면 변수를 할당을 안 하고 그대로 쓰면 되는 듯 하다.

function solution(n){
    return (n+"").split("").reduce((acc, curr) => acc + parseInt(curr), 0)
}
  1. n을 문자열로 만들어줌(숫자+문자 = 문자이므로 문자인 공백을 더해 주면 형태는 바뀌지 않으면서 문자로 형변환만 된다.)
  2. split으로 문자를 나눠 문자 배열로 만들어줌
  3. reduce로 배열을 전부 더해줌. 나는 map으로 문자를 숫자변환해 줬는데, 여기서는 parseInt()를 사용해서 문자로 변화시켜 줬다.

parseInt()는 원래는 문자열의 숫자를 2진법, 16진법 등의 다른 형식으로 바꿔주는 함수인데, 문자열을 숫자로 바꿔주는 기능을 갖고 있으므로 10진법(혹은 생략)하면 문자를 숫자로 바꿀 수 있다.

혹은 그냥 *1을 해줘도 숫자로 변환할 수 있다! 이게 제일 쉬운 듯 하다.

function solution(n){
    return (n+"").split("").reduce((acc, curr) => acc + curr * 1, 0)
}

출처 : 자바스크립트 공식 문서

reduce()는 배열의 총합을 구해주는 api이다. acc는 누적 값, curr은 현재 값을 의미한다. 0은 초기값이다. 초기값을 주지 않으면 배열의 첫 번째 항목은 리듀서를 거치지 않고 누적 값(acc)로 들어간다. 아래의 코드는 reduce를 이용하여 배열의 합계를 구하는 방법이다.

//anonymous 함수 사용
const sum = [1, 2, 3].reduce(function (acc, curr) {
        return acc + curr;
    }, 0)
    console.log(sum);
    //6
//arrow function 사용
const sum = [1, 2, 3].reduce((acc, curr) => {
        return acc + curr;
    }, 0)
    console.log(sum);
    //6
//arrow function은 {}값과 return을 생략할 수 있음. 
const sum = [1, 2, 3].reduce((acc, curr) => acc + curr, 0)
    console.log(sum);
    //6

다시 원래 문제로 돌아가서, 이 값은 초기값을 주지 않으면 숫자가 그대로 합쳐지는데 . 초기값이 없으므로 첫 번째 숫자가 acc로 바로 들어가서 문자가 숫자로 변환이 안 되었기 때문이다. 문자열+숫자 = 문자열이 된다. 따라서 반드시 초기값을 줘야 한다!

///초기값을 주지 않은 경우
function solution(n){
    return (n+"").split("").reduce((acc, curr) => acc + curr * 1)
}
console.log(solution(123))
//123

참고할 풀이 2

function solution(n)
{
    var a = (n + '').split('');
    var b = 0;
    for(var i = 0; i < a.length; ++i) {
        b += parseInt(a[i]);
    }
    return b;
    //return n.toString().split('').reduce((a, b) => (a * 1) + (b * 1));
}

위의 식은 반복문을 이용해서 풀어 줬다. i++이 아닌 ++i를 써 줬다. 이 개념도 헷갈려서 다시 한 번 정리해봤다.

var i = 42;
alert(i++); // shows 42
alert(i); // shows 43
i = 42;
alert(++i); // shows 43
alert(i); // shows 43

i++은 한 줄이 끝나고 다음 줄 부터 값을 증가시켜준다. ++i는 그 줄에서 바로 값을 증가시켜 준다. 위 식에서는 i++을 하나 ++i를 하나 결과값이 동일하다. for문은 조건문을 검사한 후 값을 증가시키기 때문에 당장 증가시키나 다음 줄에서 증가시키나 결과값이 같은 것이다.

참고할 풀이 3

function solution(n){
    var sum = 0;
    do {
        sum += n%10;//수를 10으로 나눠서 나머지 구함. 123이면 3
        n = Math.floor(n/10);//수를 10으로 나눈 몫을 얻음, 123이면 12
    } while(n > 0);//12>0이라서 반복
    return sum;
}
//다음은 12/10의 나머지인 2를 더해줌, 몫은 1이라서 다시 반복
//1/10의 나머지인 1을 더함. 이것을 10으로 나누면 몫이 0 이하라서 반복 종료. 
//최종 합은 6

do-while문을 사용해 줬다. do-while문은 for이나 while같은 반복문이지만 구문이 실행된 후에 조건을 검사하기 때문에 조건이 맞지 않아도 무조건 한 번은 실행된다는 특징이 있다. while문은 조건을 검사한 후 구문을 실행한다.

math.floor은 주어진 숫자와 작거나 같은 수 중 가장 큰 수를 반환한다. 예를 들어, math.floor(5.95) = 5이다.

굳이 do while문을 쓰지 않아도 while문으로도 반복이 가능하다.

function solution(n){
    var sum = 0;
    while(n > 0){
        sum += n%10;
        console.log(sum);
        n = Math.floor(n/10);
        console.log(n);
        console.log('----');
    } 
    return sum;
}
console.log(solution(123));
//6

참고할 풀이4

function solution(n) {
    var arr = n.toString().split('');
    var sum = 0;
    arr.forEach(element => {
        sum += parseInt(element);
    });
    return sum;
}

toString()은 문자열을 반환해준다.
forEach는 주어진 함수를 배열 요소 각각에 실행시켜 준다.

const array1 = ['a', 'b', 'c'];
array1.forEach(element => console.log(element));

// expected output: "a"
// expected output: "b"
// expected output: "c"

따라서 위의 구문은 sum에다 숫자로 변경한 각 요소들을 더해준다.

profile
전 이것도 몰라요

0개의 댓글

관련 채용 정보