Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 10진수를 로마 숫자로 변환하는 방법 (1~3999 범위)

이 튜토리얼에서는 1부터 3999 사이의 10진수를 로마 숫자(Roman Numerals)로 변환하는 프로그램을 C++로 구현하는 방법을 알아보겠습니다.

프로그램은 임의의 정수를 입력받아, 해당 숫자에 대응하는 로마 숫자 문자열을 출력하는 것이 목표입니다. 예를 들어 3949가 입력되면 'MMMCMXLIX'를 출력해야 합니다.

변환 원리

로마 숫자는 기본 기호(I, V, X, L, C, D, M)와 이들을 조합한 형태(IV, IX, XL, XC, CD, CM 등)로 구성됩니다. 변환 알고리즘은 다음과 같이 동작합니다.

  • 값이 큰 단위(1000, 900, 500...)부터 차례대로 확인합니다.
  • 현재 단위 값으로 입력 숫자를 나눈 몫만큼 해당 기호를 반복 출력합니다.
  • 나머지 값을 새로운 입력 숫자로 사용하고, 다음으로 작은 단위로 넘어갑니다.
  • 입력 숫자가 0이 될 때까지 위 과정을 반복합니다.

C++ 구현 코드

#include <bits/stdc++.h>
using namespace std;

// 10진수를 로마 숫자로 변환하는 함수
int printRoman(int number){
    // 값과 대응하는 기호를 큰 단위부터 저장
    int num[] = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
    string sym[] =
    {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
    
    int i = 12; // 가장 큰 단위(1000)부터 시작
    while(number > 0){
        int div = number / num[i];   // 현재 단위로 나눈 몫
        number = number % num[i];    // 나머지를 새로운 값으로 설정
        while(div--){
            cout << sym[i];          // 몫만큼 기호 출력
        }
        i--;                          // 다음으로 작은 단위로 이동
    }
}

int main(){
    int number = 3949;
    printRoman(number);
    return 0;
}

실행 결과

MMMCMXLIX

코드 설명

입력값이 3949일 때의 변환 과정은 다음과 같습니다.

  1. 3949 ÷ 1000 = 3 → 'M'을 3번 출력 (MMM), 나머지 949
  2. 949 ÷ 900 = 1 → 'CM' 출력, 나머지 49
  3. 49 ÷ 40 = 1 → 'XL' 출력, 나머지 9
  4. 9 ÷ 9 = 1 → 'IX' 출력, 나머지 0

최종적으로 MMMCMXLIX가 출력됩니다.

이 알고리즘은 각 단위를 한 번씩만 확인하므로 시간 복잡도는 O(1)로 상수 시간 내에 처리되며, 1~3999 범위의 모든 정수를 안정적으로 변환할 수 있습니다. 참고로 로마 숫자 체계에서는 4000 이상의 수를 표준 기호로 표현할 수 없기 때문에, 이 범위 제한이 적용됩니다.