[프로그래머스] 하샤드 수 - JavaScript

하샤드 수

문제

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

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

입출력 예제

arrreturn
10true
12true
11false
13false

답안

function solution(x) {
    const arr = x.toString().split("");
    const num = arr.reduce((prev, curr) => parseInt(prev) + parseInt(curr))
    const result = x % num === 0;
    return result;
}

풀이

숫자 s를 string으로 변경하고 각 자릿수를 담은 배열 arr을 생성합니다.
reduce메소드를 사용하여 모든 자릿수를 더한 값을 num에 대입합니다.
마지막으로 x값과 num을 나누어 나머지가 0인지 확인합니다.

답안 보완

function solution(x) {
    let result = 0;
    x = x.toString();
    for (let i = 0; i < x.length; i++) {
        result += +x[i];
    }
    return x % result === 0;
}

배열로 나누지 않고 string으로 변환만 하고 reduce 메소드보다 빠르게 처리될 수 있도록 for문을 사용했습니다.

그 결과 속도는 기존보다 빨라졌습니다.

No기존변경
10.12ms, 30.2MB0.04ms, 30.3MB
20.12ms, 30.4MB0.04ms, 30.3MB
30.13ms, 30.1MB0.05ms, 30.4MB
40.13ms, 30.3MB0.04ms, 30.5MB
50.09ms, 30.2MB0.07ms, 30.3MB
60.08ms, 30.4MB0.07ms, 30.3MB
70.10ms, 30.3MB0.04ms, 30.2MB
80.09ms, 30.2MB0.04ms, 30MB
90.08ms, 30.3MB0.12ms, 30.2MB
100.11ms, 30.4MB0.04ms, 30.1MB
110.13ms, 30.5MB0.06ms, 30.3MB
120.06ms, 30.3MB0.04ms, 30MB
130.11ms, 30.2MB0.05ms, 30.4MB
140.06ms, 30.3MB0.05ms, 30.4MB
150.06ms, 30.5MB0.04ms, 30.1MB
160.25ms, 30.4MB0.04ms, 30.3MB
170.07ms, 30.1MB0.05ms, 30.3MB

좋은 웹페이지 즐겨찾기