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

JavaScript로 깔끔한 숫자(Tidy Number) 판별하기

깔끔한 숫자(Tidy Number)란 각 자릿수가 오름차순(정확히는 감소하지 않는 순서, non-decreasing order)으로 배열되어 있는 수를 말합니다.

깔끔한 숫자의 예시

489 → 각 자릿수가 4 < 8 < 9 순으로 커지므로 깔끔한 숫자입니다.
234557 → 2 ≤ 3 ≤ 4 ≤ 5 ≤ 5 ≤ 7 이므로 깔끔한 숫자입니다.
34535 → 중간에 5에서 3으로 작아지는 부분이 있으므로 깔끔한 숫자가 아닙니다.

이번 글에서는 하나의 숫자를 입력받아 해당 숫자가 깔끔한 숫자인지 아닌지를 판별하는 JavaScript 함수를 작성해 보겠습니다.

접근 방법

가장 효율적인 방법은 재귀(Recursion)를 활용하는 것입니다. 숫자를 뒤에서부터 한 자릿수씩 확인하면서, 현재 자릿수가 바로 앞에서 확인한 자릿수보다 크다면 즉시 false를 반환하고, 그렇지 않으면 남은 자릿수에 대해 재귀적으로 검사를 계속 진행합니다.

예제 코드

다음은 재귀 함수를 사용한 구현 예시입니다.

const num = 234789;

const isTidy = (num, last = 10) => {
    if (num) {
        // 현재 자릿수가 이전 자릿수보다 크면 깔끔한 숫자가 아님
        if (num % 10 > last) {
            return false;
        }
        // 마지막 자릿수를 제거하고 재귀 호출
        return isTidy(Math.floor(num / 10), num % 10);
    }
    return true;
};

console.log(isTidy(num));

코드 설명

이 코드의 동작 원리를 단계별로 살펴보겠습니다.

1. 초기값 설정: 매개변수 last의 기본값을 10으로 설정합니다. 어떤 자릿수도 9보다 클 수 없으므로, 첫 번째 비교에서는 항상 통과하게 됩니다.

2. 자릿수 추출: num % 10 연산으로 현재 숫자의 마지막 자릿수를 얻습니다.

3. 비교 및 판별: 현재 자릿수가 이전에 확인한 자릿수(last)보다 크면 자릿수가 감소하는 지점이 존재한다는 의미이므로 false를 반환합니다.

4. 재귀 진행: Math.floor(num / 10)으로 마지막 자릿수를 제거한 숫자와 현재 자릿수를 인자로 전달하여 재귀 호출합니다.

5. 종료 조건: 모든 자릿수를 확인하여 num이 0이 되면 자릿수가 끝까지 감소하지 않았다는 뜻이므로 true를 반환합니다.

출력 결과

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

true

234789의 각 자릿수는 2 → 3 → 4 → 7 → 8 → 9 순으로 계속 커지기만 하므로, 이 숫자는 깔끔한 숫자에 해당하며 결과로 true가 출력되는 것을 확인할 수 있습니다.

마무리

이처럼 재귀를 활용하면 반복문 없이도 간결하고 직관적으로 깔끔한 숫자 여부를 판별할 수 있습니다. 시간 복잡도는 숫자의 자릿수에 비례하여 O(d)(d는 자릿수)이며, 공간 복잡도 역시 재귀 호출 스택으로 인해 O(d)입니다. 만약 재귀 대신 반복문을 선호한다면, 문자열로 변환한 후 인접한 두 자릿수를 순차적으로 비교하는 방식으로도 동일한 결과를 얻을 수 있습니다.