Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 하샤드(Harshad) 수 찾기 – 자릿수 합으로 나누어떨어지는 수 판별하기

하샤드 수(Harshad Number)란 각 자릿수의 합으로 정확히 나누어떨어지는 수를 의미합니다. 예를 들어 126은 자릿수의 합이 1+2+6=9이고, 126을 9로 나누면 나머지 없이 딱 떨어지므로 하샤드 수입니다.

하샤드 수의 특징

  • 모든 한 자리 수(1~9)는 하샤드 수입니다.
  • 하샤드 수는 [1,2,3,4,5,6,7,8,9,10], [110,111,112], [1010,1011,1012]처럼 연속된 구간(cluster)으로 존재하는 경우가 많습니다.

이번에 구현할 함수는 하나의 숫자를 입력받아 다음과 같이 동작해야 합니다. 입력값이 하샤드 수가 아니면 -1을 반환하고, 하샤드 수라면 해당 수가 포함된 연속 하샤드 구간(streak)의 길이를 반환합니다.

예시

harshadNum(1014) = harshadNum(1015) = harshadNum(1016) = harshadNum(1017) = 4
harshadNum(1) = 10
harshadNum(12) = 1
harshadNum(23) = -1

이 문제는 두 개의 주요 함수로 나누어 풀어보겠습니다.

  • isHarshad() : 숫자 num을 입력받아 그 수가 하샤드 수인지 여부에 따라 불리언 값을 반환합니다.
  • harshadNum() : 실제 숫자를 처리하는 메인 함수로, 여러 지점에서 isHarshad()를 호출하여 연속 구간의 길이를 반환합니다.

isHarshad() 함수 구현

const isHarshad = (num) => {
    let sum = 0, temp = num;
    while(temp){
        sum += temp % 10;
        temp = Math.floor(temp/10);
    }
    return num % sum === 0;
}

숫자의 각 자릿수를 하나씩 더해 합계를 구한 뒤, 원래 수가 그 합으로 나누어떨어지는지 확인하는 아주 단순한 반복 함수입니다.

harshadNum() 함수 구현

const harshadNum = (number) => {
    //입력값이 하샤드 수가 아니면 -1 반환
    if(!isHarshad(number)){
        return -1;
    }
    let streak = 1, prev = number-1, next = number+1;
    //앞쪽 연속 구간 확인
    while(isHarshad(prev) && prev > 0){
        streak++;
        prev--;
    }
    //뒤쪽 연속 구간 확인
    while(isHarshad(next)){
        streak++;
        next++;
    }
    return streak;
};
console.log(harshadNum(1014));

위 코드의 동작 과정을 정리하면 다음과 같습니다.

  • 먼저 입력값이 하샤드 수인지 확인하고, 아니라면 즉시 -1을 반환하며 함수를 종료합니다.
  • 하샤드 수가 계속 이어지는 동안 한 루프는 앞쪽 방향으로, 다른 루프는 뒤쪽 방향으로 탐색하면서 연속 구간 길이(streak)를 계속 갱신합니다.
  • 마지막으로 계산된 streak 값을 반환합니다.

전체 코드

const isHarshad = (num) => {
    let sum = 0, temp = num;
    while(temp){
        sum += temp % 10;
        temp = Math.floor(temp/10);
    }
    return num % sum === 0;
}
const harshadNum = (number) => {
    //입력값이 하샤드 수가 아니면 -1 반환
    if(!isHarshad(number)){
        return -1;
    }
    let streak = 1, prev = number-1, next = number+1;
    //앞쪽 연속 구간 확인
    while(isHarshad(prev) && prev > 0){
        streak++;
        prev--;
    }
    //뒤쪽 연속 구간 확인
    while(isHarshad(next)){
        streak++;
        next++;
    }
    return streak;
};
console.log(harshadNum(1014));

출력 결과

위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다.

4