Description
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
Constraints
- x는 1 이상, 10000 이하인 정수입니다.
What is "Harshad number"?
In mathematics, a harshad number (or Niven number) in a given number base is an integer that is divisible by the sum of its digits when written in that base. Harshad numbers in base n are also known as n-harshad (or n-Niven) numbers. Harshad numbers were defined by D. R. Kaprekar, a mathematician from India. (Wikipedia)
주어진 진법에서, 그 수의 각 자릿수 숫자의 합으로 그 수가 나누어지는 양의 정수
My Solution
function solution(arr) {
const str = arr.toString();
let sum = 0;
for (let i = 0; i < str.length; i++) {
sum += Number(str[i]);
}
return Number(str) % sum ? false : true;
}
우선 함수의 인자로 받은 배열을 toString()을 사용해 문자열로 변환한다.
그 후 for문으로 문자열의 각 자릿수의 합을 구해준다.
마지막으로 문자열을 각 자릿수의 합으로 나눈 나머지가 0이면 true, 그 외면 false를 리턴하도록 삼항 연산자를 써 주었다.
Other's Solution
함수에 array 대신 number를 받을 때의 풀이이다.
function harshad(n){
return !(n % (n + "").split("").reduce((a, b) => +b + +a ));
}
split, reduce를 이용해 간결하게 한 줄로 풀어냈다.
(num + '').split('').reduce((a, b) => +a+ +b))
이것이 숫자 n의 각 자릿수의 합이 된다.
n을 n의 각 자릿수의 합으로 나눈 값의 나머지가 0이면 원래는 false를 반환하지만, ! 연산자로 true를 반환하도록 하였다.
여기서 숫자 n을 문자열로 변환하기 위해서 n + ""을 하고 있다. 이참에 숫자를 문자열로 바꾸는 방법을 정리하고자 한다.
숫자를 문자열로 변환하는 4가지 방법
- toString() : toString의 파라미터로 base 숫자를 입력해 줄 경우, 해당 진법으로 숫자를 변환하여 문자열로 리턴한다. 예를 들어 3.toString(2) 라고 하면, 10진수 숫자인 3을 이진법으로 변환해 문자열로 "11"이 리턴된다.
- String()
- Template String
- 빈 문자열 이어붙이기
'하샤드 수'라는 것이 처음엔 생소해서 어려울 줄 알았지만 사실은 매우 직관적인 문제였다. 또한 다른 사람의 풀이를 보며 알아가는 것도 많았다. 앞으로 배열의 각 요소의 합을 구할 때 for문 대신 reduce를 쓰는 연습을 많이 해야겠다. logical NOT(!) operator 역시 잘 쓰면 알고리즘이 한결 깔끔해지는 것 같다.
'Algorithms > Programmers' 카테고리의 다른 글
[프로그래머스 Level 1] 제일 작은 수 제거하기 (자바스크립트) (0) | 2021.10.07 |
---|---|
[프로그래머스 Level 1] 행렬의 덧셈 (자바스크립트) (0) | 2021.10.05 |
[프로그래머스 Level 1] 직사각형 별찍기 (자바스크립트) (0) | 2021.10.05 |
[프로그래머스 Level 1] x만큼 간격이 있는 n개의 숫자 (자바스크립트) (0) | 2021.10.03 |
[프로그래머스 Level 1] 평균 구하기 (자바스크립트) (0) | 2021.10.01 |