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

JavaScript로 정수를 로마 숫자로 변환하는 알고리즘 구현 방법

이름에서 유추할 수 있듯이, intToRoman() 함수는 인자로 전달받은 정수에 해당하는 로마 숫자 문자열을 반환하는 역할을 합니다. 이번 글에서는 이 함수를 JavaScript로 직접 구현해 보겠습니다.

동작 원리

로마 숫자는 I(1), V(5), X(10), L(50), C(100), D(500), M(1000)이라는 기본 기호로 구성됩니다. 또한 4와 9처럼 작은 기호가 큰 기호 앞에 오는 감산 표기(IV, IX, XL, XC, CD, CM)도 존재합니다.

따라서 변환 로직은 다음과 같습니다. 숫자가 0이 될 때까지 반복문을 돌면서, 현재 값이 어떤 단위보다 크거나 같은지 큰 단위부터 차례대로 검사하고, 해당하는 로마 기호를 결과 문자열에 추가한 뒤 그만큼 값을 차감하면 됩니다. 특히 900(CM), 400(CD), 90(XC), 40(XL), 9(IX), 4(IV) 같은 감산 표기 조건을 먼저 확인하는 것이 핵심입니다.

예제 코드

const intToRoman = (num) => {
    let result = "";
    while(num){
        if(num>=1000){
            result += "M";
            num -= 1000;
        }else if(num>=500){
            if(num>=900){
                result += "CM";
                num -= 900;
            }else{
                result += "D";
                num -= 500;
            }
        }else if(num>=100){
            if(num>=400){
                result += "CD";
                num -= 400;
            }else{
                result += "C";
                num -= 100;
            }
        }else if(num>=50){
            if(num>=90){
                result += "XC";
                num -= 90;
            }else{
                result += "L";
                num -= 50;
            }
        }else if(num>=10){
            if(num>=40){
                result += "XL";
                num -= 40;
            }else{
                result += "X";
                num -= 10;
            }
        }else if(num>=5){
            if(num>=9){
                result += "IX";
                num -= 9;
            }else{
                result += "V";
                num -= 5;
            }
        }else{
            if(num>=4){
                result += "IV";
                num -= 4;
            }else{
                result += "I";
                num -= 1;
            }
        }
    }
    return result;
};
console.log(intToRoman(178));
console.log(intToRoman(89));
console.log(intToRoman(55));
console.log(intToRoman(1555));

출력 결과

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

CLXXVIII
LXXXIX
LV
MDLV

178은 CLXXVIII(100+50+10+10+5+1+1+1), 89는 LXXXIX(50+30+9), 55는 LV(50+5), 1555는 MDLV(1000+500+50+5)로 정확하게 변환되는 것을 확인할 수 있습니다. 이 알고리즘은 각 자릿수를 한 번씩만 처리하므로 시간 복잡도는 O(1)로 매우 효율적입니다.