V-logue

[항해99] 프로그래머스 - 자릿수 더하기 본문

항해 99/프로그래머스 Algo

[항해99] 프로그래머스 - 자릿수 더하기

보그 2022. 5. 17. 02:37

대충 2런 문제다.


일단 이 문제를 푸는데, 바로 생각난 것이 숫자를 배열로 만들어서 배열의 합을 구하면 될 것 같다는 생각을 했다.

 

그런데 reduce의 용법을 제대로 이해하지 못해, 정답을 확인하고 나서 알게 된 것이

 

function solution(n){
    
    return n.toString().split('').reduce((function(acc, cur) {return +acc + +cur}),0);
        
}

보면 알겠지만, 따로 변수를 주지않고 return값에 모든 코드를 집어 넣은 모습을 볼 수 있다.

 

일단 callback 함수에 대한 이해가 필요할 것 같아 찾아보았다.

 

개인적인 사견으로 Callback 함수란,

더보기

파라미터로 함수를 전달하는 함수, 익명으로도 전달 가능하다.

콜백(callback) 함수란 파라미터(매개변수)로서 함수를 전달받아, 함수 내부에서 실행되는 함수이다.

 

callback 함수는 사용 원칙이 있는데,

  • 익명의 함수로 사용될 것 ,
  • 자바스크립트는 null값과 undefined 타입을 제외하고 모든 것을 객체로 다루는데, 함수를 콜백으로 다뤄줄 경우, 함수의 이름만 넘겨주면 된다.
function() // finishFunc()

이렇게 콜백 함수에  ( )를 붙일 필요가 없다는 말이다.

  • 전역변수, 지역변수를 콜백함수의 파라미터로 전달 가능하다.

더 깊은 설명은... 생략하겠다. 아무튼, return값에서 실행된 reduce함수 내부에서 callback함수가 파라미터로서 

reduce함수를 전달받아 실행됐다고  설명할 수 있다.

 

return문은 함수 내부에서 실행되며, 함수를 호출한 곳에 데이터를 반환하는 즉시 함수를 강제종료하기 때문에, 

=> 대신 fucntion 콜백함수를 주어 reduce함수를 전달받아 다시 실행시켰다고 생각했다.

 

사실은 제대로 이해하지 못한 것 같다.


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

나는 이런 방식으로 풀고 있었는데, 정확히 내가 생각한 코드는 이거였다.

 

내가 놓친게 있으니 바로

parseInt() 였다.

 

숫자를 문자열로 만든 후 배열로 만들었기 때문에, parseInt가 없다면 문자열의 합이기 때문에

 

console.log(123)이라면 1 + 2 + 3 = 6이 아닌, 123이 출력되버리는 것이었다. 바로 이 점을 이해하지 못했기 때문에

 

계속해서 답이 나오지 않았다.

 

정답을 보자마자 머리를 탁 쳐버리고 말았다.

Comments