양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다.
예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다.
자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
x는 1 이상, 10000 이하인 정수입니다.
arr | return |
---|---|
10 | true |
12 | true |
11 | false |
13 | false |
입출력 예 #1
10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다.
입출력 예 #2
12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다.
입출력 예 #3
11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다.
입출력 예 #4
13의 모든 자릿수의 합은 4입니다. 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.
1. 숫자를 문자형으로 변경해준다.
2. 각각 숫자를 분리해준다.
3. 각각 숫자형으로 변경한 후 더해준다.
4. 더해진 값과 원래 전달받는 숫자를 나누어 떨어지면 true 그렇지 않으면 false를 리턴한다.
function solution(x) {
var answer = true;
let toStr = ➀x.toString().➁split("")
let sum = toStr.reduce((a,b)=> ➂parseInt(a)+parseInt(b))
answer = Number.➃isInteger(x/sum)
return answer;
}
➃ x와 sum을 나누어 떨어지면 정수로 나누어 지기 때문에 정수인지 아닌지 판별하는 메서드를 찾아 봤다.
➁ Number.isInteger(➀value)
➀ value = 정수인지 확인하려는 값.
➁ 주어진 값의 정수 여부를 Boolean으로 반환해 줍니다.
다른 풀이
function solution(x){
let answer = true
let toStr = x.toString().split('')
let sum = toStr.reduce((a,b)=>a+=Number(b),0)
return x % sum === 0 ? answer : !answer
}
toStr.reduce((a,b)=>a+=Number(b),0)
reduce에 두번째 인자로 0을 지정해 주었다.
toStr은 현재 문자형이기 때문에 0을 주지 않으면 a,b 둘다 형변환을 해주어야 하는데, 0을 써주면 하나만 해주면 되기때문에 0을 추가해줬다.
x % sum === 0 ? answer : !answer
Number.isInteger()매서드를 사용하지 않아도 쉽게 해결 할 수 있었다.
function Harshad(n){
return !(n % (n + "").split("").reduce((a, b) => +b + +a ));
}
가독성면에서 아쉬운 해결 방법이였지만, 이문제를 가지고 온 이유는
reduce((a, b) => +b + +a )
이 부분 때문이였다.
문자형을 숫자형으로 형변환 해줄때, 앞에 +
을 붙여주면 형변환이 된다는 걸 이 문제를 보고 알았다.
알고리즘을 공부하면서 난이도는 올라가고,많은 개념들을 배우다 보니 확실하게 알았던 개념들도 혼돈되기 시작했다.
끔직한 혼종들ㅋㅋ 이때 이런 개념들을 다시 차근차근 익혀야 겠다.