The journey to becoming a developer

My future is created by what I do today, not tomorrow.

Algorithms/Programmers

[프로그래머스 Level 1] 하샤드 수 (자바스크립트)

Millie 2021. 10. 5. 20:06

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가지 방법

참고 블로그 링크

  1. toString() : toString의 파라미터로 base 숫자를 입력해 줄 경우, 해당 진법으로 숫자를 변환하여 문자열로 리턴한다. 예를 들어 3.toString(2) 라고 하면, 10진수 숫자인 3을 이진법으로 변환해 문자열로 "11"이 리턴된다.
  2. String()
  3. Template String
  4. 빈 문자열 이어붙이기

'하샤드 수'라는 것이 처음엔 생소해서 어려울 줄 알았지만 사실은 매우 직관적인 문제였다. 또한 다른 사람의 풀이를 보며 알아가는 것도 많았다. 앞으로 배열의 각 요소의 합을 구할 때 for문 대신 reduce를 쓰는 연습을 많이 해야겠다. logical NOT(!) operator 역시 잘 쓰면 알고리즘이 한결 깔끔해지는 것 같다.