이름에서 유추할 수 있듯이, 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)로 매우 효율적입니다.