
오늘의 알고리즘 코드카타 문제는 자릿수 더하기 였다.
개발에는 정답이 없구나를 또 깨달으며 오늘의 TIL 시작!
자연수
N이 주어지면,N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
- 입출력 예
n = 123==> 결과값6
n = 987==> 결과값24
function solution(n) {
let numArray = String(n).split("");
let answer = 0;
numArray.forEach(function (item) {
answer += Number(item);
});
return answer
}n에 String() 메소드를 사용해 문자열로 변환하고, split("")을 써서 배열화한다.answer에 합산한 값이 누적될 수 있도록 복합대입연산자 +=을 사용한다.(n + "").split("")와 reduce()를 활용한 풀이
function solution(n){
return (n+"").split("").reduce((acc, curr) => acc + parseInt(curr), 0)
}
: 보자마자 의문이 든다. (n+"").split("")은 뭐지?.... 싶은 찰나 프로그래머스 댓글에 잘 정리된 내용이 있어 인용한다.
자바스크립트에서 덧셈 연산자
+를 사용할 때 피연산자 중 어느 하나가 문자열이면 문자열이 아닌 다른 피연산자도 문자열로 타입이 변환되어 문자열을 합친 값이 반환된다. 위의 예시에서n+""은 숫자 + 문자열의 형태이기 때문에split("")시 결과적으로 문자열n을 반환한다. 참고로""은 빈문자열이기 때문에 위와 같이 연결하더라도 반환값에 영향을 주지 않는다. 그저 다른 피연산자를 문자열로 형변환하는 역할을 하여String(n)과 동일하게 사용할 수 있다.
: 엥 ㄴㅇㄱ 충격 ..! 덧셈 연산자 +는 피연산자 중 어느 하나라도 문자열이 있으면 문자열이 아닌 다른 피연산자도 문자열로 타입을 변환한다는 것을 까맣게 잊고 있었다. 이런 내용은 뭔가 학문적으로 공부한다기보단 코딩하면서 몸으로 체감하는 것인데 그것조차 못한 것 같다 😅
n + ""을 해서 정수인 n까지 문자열로 바꿔버리는 방법이었다. 내가 활용한 String(n)과 동일한 효과를 얻은 거다. 자주 쓰이는 방식이라고 하니 알아둬야지!
reduce()에 대한 부분도 충격적이었는데, 분명 나도 처음엔 배열의 누적값을 활용해야 하니 reduce()를 활용해보려고 했었다.
function solution(n) {
console.log((n + "").split("").reduce((acc, curr) => acc + parseInt(curr)));
}
이런 식으로. 그치만 이렇게 했을 때 solution(123)을 넣어주면 반환값이 6이 아닌 "123"이 나왔다. 아무리 이리저리 욱여넣어봐도 넘버타입으로 변환이 안될 것 같아서 포기하고 반복문을 돌렸던 거였는데 예시처럼 마지막에 0을 넣어 initial type 초기값을 정해주면 된다니 .. 충격적이다..!
내가 작업한 방식에서는 reduce에 초기값이 없이 사용되어 첫 번째 배열 요소인 "1"이 초기값이 되어 문자열 합산이 된 것이고, 초기값을 지정해준 예시의 코드에서는 reduce의 초기값이 0으로 지정되어 넘버로 계산이 된 것이었다..!
초기값의 중요성을 깨달으며 오늘도 reduce()에 대해 알아가는 하루였다~ 며칠 째 이놈을 보고 있는 것 같은데 계속 써봐도 어려운 마성의 매력이 있다 .. 🥀