알고리즘 문제/Medium

12. 정수를 로마 숫자로 변환하기 - Integer to Roman

네야_IT 2024. 9. 6. 00:49
반응형
  1. 로마 숫자는 7개의 다른 기호로 구성되며, 각 기호의 값은 다음과 같습니다:

기호값

I 1
V 5
X 10
L 50
C 100
D 500
M 1000

로마 숫자는 십진수 자릿값의 변환을 가장 높은 자리부터 낮은 자리까지 차례로 추가하여 형성됩니다. 십진수 자릿값을 로마 숫자로 변환하는 규칙은 다음과 같습니다:

  1. 값이 4 또는 9로 시작하지 않는 경우, 입력에서 빼낼 수 있는 최대 값의 기호를 선택하여 결과에 추가하고, 그 값을 뺀 나머지를 다시 로마 숫자로 변환합니다.
  2. 값이 4 또는 9로 시작하는 경우, 다음 기호에서 하나를 뺀다는 빼기 형식을 사용합니다. 예를 들어, 4는 5(V)보다 1(I) 작으므로 "IV"이며, 9는 10(X)보다 1(I) 작으므로 "IX"입니다. 사용되는 빼기 형식은 다음과 같습니다: 4(IV), 9(IX), 40(XL), 90(XC), 400(CD), 900(CM).
  3. 10의 제곱수 (I, X, C, M)만이 최대 3번 연속으로 추가될 수 있습니다. 5(V), 50(L), 500(D)은 여러 번 추가할 수 없습니다. 만약 기호를 4번 추가해야 할 경우, 빼기 형식을 사용합니다.

주어진 정수를 로마 숫자로 변환하세요.

예시 1:

입력: num = 3749
출력: "MMMDCCXLIX"

설명:
3000 = MMM는 1000 (M) + 1000 (M) + 1000 (M)
700 = DCC는 500 (D) + 100 (C) + 100 (C)
40 = XL는 50 (L)보다 10 (X) 적음
9 = IX는 10 (X)보다 1 (I) 적음
참고: 49는 50 (L)보다 1 (I) 적은 것이 아닙니다. 변환은 십진수 자릿수를 기준으로 합니다.

예시 2:

입력: num = 58
출력: "LVIII"

설명:
50 = L
8 = VIII

예시 3:

입력: num = 1994
출력: "MCMXCIV"

설명:
1000 = M
900 = CM
90 = XC
4 = IV

제약사항:

1 <= num <= 3999

 

 

풀이

 

def int_to_roman(num):
    # 로마 숫자와 해당 값의 목록을 정의합니다.
    roman_numerals = [
        ("M", 1000),
        ("CM", 900),
        ("D", 500),
        ("CD", 400),
        ("C", 100),
        ("XC", 90),
        ("L", 50),
        ("XL", 40),
        ("X", 10),
        ("IX", 9),
        ("V", 5),
        ("IV", 4),
        ("I", 1)
    ]
    
    # 결과 문자열을 초기화합니다.
    result = ""
    
    # 각 로마 숫자와 값에 대해 반복합니다.
    for symbol, value in roman_numerals:
        # 주어진 숫자에서 현재 값으로 나누어 몫을 구합니다.
        while num >= value:
            result += symbol  # 결과 문자열에 로마 숫자를 추가합니다.
            num -= value      # 현재 값을 주어진 숫자에서 뺍니다.
    
    return result

# 예시
print(int_to_roman(3749))  # 출력: "MMMDCCXLIX"
print(int_to_roman(58))    # 출력: "LVIII"
print(int_to_roman(1994))  # 출력: "MCMXCIV"
반응형