알고리즘_하샤드 수

정재연·2022년 1월 20일
0

알고리즘

목록 보기
12/23

하샤드 수

1. 문제 설명

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다.
예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다.
자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

2. 제한 조건

x는 1 이상, 10000 이하인 정수입니다.

3. 입출력 예

arrreturn
10true
12true
11false
13false

4. 입출력 예 설명

입출력 예 #1
10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다.

입출력 예 #2
12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다.

입출력 예 #3
11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다.

입출력 예 #4
13의 모든 자릿수의 합은 4입니다. 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.


5. 나의 문제 풀이

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()매서드를 사용하지 않아도 쉽게 해결 할 수 있었다.

6. 다른 사람의 문제 풀이

function Harshad(n){
  return !(n % (n + "").split("").reduce((a, b) => +b + +a ));
}

가독성면에서 아쉬운 해결 방법이였지만, 이문제를 가지고 온 이유는

reduce((a, b) => +b + +a )

이 부분 때문이였다.
문자형을 숫자형으로 형변환 해줄때, 앞에 + 을 붙여주면 형변환이 된다는 걸 이 문제를 보고 알았다.

7. 문제를 풀면서 들었던 생각

알고리즘을 공부하면서 난이도는 올라가고,많은 개념들을 배우다 보니 확실하게 알았던 개념들도 혼돈되기 시작했다.
끔직한 혼종들ㅋㅋ 이때 이런 개념들을 다시 차근차근 익혀야 겠다.

profile
코린이 개발자 :)

0개의 댓글