자연수 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 하면 됩니다.
나는 되게 복잡하게 풀었다...이 풀이가 너무 복잡한 것 같아서 그냥 다른 사람 풀이 참고하려고 빨리 풀었다. 이 풀이를 참고하지 말고 다른 사람 풀이를 참고하자
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;
}
이 방식은 기본적으로 내가 푼 방식과 유사한 듯 하다. 나는 습관적으로 변수를 전부 만들어 줬는데 짧게 쓰려면 변수를 할당을 안 하고 그대로 쓰면 되는 듯 하다.
function solution(n){
return (n+"").split("").reduce((acc, curr) => acc + parseInt(curr), 0)
}
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
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문은 조건문을 검사한 후 값을 증가시키기 때문에 당장 증가시키나 다음 줄에서 증가시키나 결과값이 같은 것이다.
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
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에다 숫자로 변경한 각 요소들을 더해준다.