양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
function solution(x) {
let answer = true;
let number = x;
let sum = 0;
// 10으로 나눈 나머지 값을 더해주고 기존의 값을 10으로 나누어준다.
while(number > 0){
sum += number % 10;
number /= 10;
// 정수형으로 변환하지 않으면 float가 되어버린다.
number = parseInt(number);
}
answer = (x % sum == 0);
return answer;
}
// 또 다른 방법
function solution(x) {
let answer = true;
let sum = 0;
x.toString().split('').map(value => sum += Math.floor(value));
answer = (x % sum == 0);
return answer;
}
자바스크립트에서는 int와 float가 명확하게 나누어져 있지 않아서, 동적으로 변환하는 것을 확인하고 int형으로 변환시켰다. 이것도 C++방식으로 푼 것 같다. 제출하고 생각해보니 parseInt는 반올림일테니 원하는 결과로 정확하게 나오려면 Math.floor 함수가 더 적절하지 않았을까 생각이 들었다.
자바스크립트에서는 강력한 기능이라고 생각하는 것 중 하나가 숫자를 String으로 변환시키고 String관련 함수들을 사용할 수 있어서 split함수를 사용해 자리수를 간편하게 나눌 수 있었다. 하지만 문자열로 인식되기 때문에 다시 형변환 해주어야 한다. 그래서 속도면에서는 약간 손해볼 것 같았지만 미세하게 더 빨랐다?! 오호.. GOOD!!
프로그래머스에서 한번 문제를 전체적으로 개편 했는지 다른사람들의 풀이는 개편 전이라고 안내되어 있다.
참고 자료 및 사이트 (감사합니다)