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

JavaScript로 1부터 n까지 숫자 이름의 글자 수 세기

문제 소개

숫자 n을 입력받아, 1부터 n까지의 숫자를 영어 단어로 나타냈을 때 사용되는 글자 수의 총합을 계산하는 JavaScript 함수를 작성해야 합니다.

예를 들어 n = 5인 경우를 살펴보겠습니다. 이때 숫자 이름은 one, two, three, four, five이며, 각 단어의 글자 수는 차례대로 3, 3, 5, 4, 4자입니다. 이를 모두 더하면 총 19자가 되므로, 출력 결과는 19가 되어야 합니다.

구현 예제

const sumUpto = (num = 1) => {
    let sum = 0;
    const lenHundred = 7;
    const lenThousand = 8;
    const lenPlaceOnes = [0,3,3,5,4,4,3,5,5,4];
    const lenPlaceTens = [0,3,6,6,5,5,5,7,6,6];
    for (let i = 1; i <= num; i++) {
        let placeOnes = i % 10;
        let placeTens = Math.floor(i / 10) % 10;
        let placeHundreds = Math.floor(i / 100) % 10;
        let placeThousands = Math.floor(i / 1000) % 10;
        sum += lenPlaceOnes[placeOnes];
        sum += lenPlaceTens[placeTens];
        if (placeHundreds != 0) {
            sum += lenHundred + lenPlaceOnes[placeHundreds];
        }
        if (placeThousands != 0) {
            sum += lenThousand + lenPlaceOnes[placeThousands];
        }
        if (placeTens === 1) {
            switch (placeOnes) {
                case 4:
                case 6:
                case 7:
                case 9:
                sum += 1;
                break;
            }
        }
        if (i > 100 && i % 100 != 0) {
            sum += 3;
        }
    }
    return sum;
}
console.log(sumUpto(12));
console.log(sumUpto(5));
console.log(sumUpto(122));

코드 동작 원리

이 코드는 숫자를 일일이 문자열로 변환하지 않고, 미리 계산해 둔 글자 수 배열을 활용해 효율적으로 합계를 구합니다.

  • lenPlaceOnes: 0부터 9까지 각 일의 자리 숫자 단어(zero, one, two … nine)의 글자 수를 담은 배열입니다.
  • lenPlaceTens: 십의 자리 단어(ten, twenty, thirty … ninety)의 기본 글자 수를 담은 배열입니다.
  • lenHundred(7), lenThousand(8): 각각 'hundred', 'thousand'라는 단어의 글자 수입니다.

반복문 안에서는 각 숫자의 자릿수를 추출한 뒤 해당하는 글자 수를 합산합니다. 백의 자리나 천의 자리 숫자가 존재하면 'hundred', 'thousand'에 해당하는 글자 수를 추가로 더해 줍니다.

11~19 구간의 숫자(eleven, twelve, thirteen 등)는 철자 규칙이 일정하지 않으므로, 십의 자리가 1일 때 switch문을 통해 thirteen, fourteen, sixteen, seventeen, nineteen처럼 글자 수가 하나 더 필요한 경우를 보정합니다.

마지막 조건문은 100보다 크면서 100으로 나누어 떨어지지 않는 수에 영국식 표기법의 'and'(3글자)를 더해 줍니다. 예를 들어 101을 'one hundred and one'로 세는 방식입니다.

출력 결과

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

51
19
1280