HOWTO · Python
Python에서 정수를 로마 숫자로 변환
이 튜토리얼은 Python에서 정수를 로마 숫자로 변환하는 방법을 알려줍니다.
이 페이지의 내용
로마 숫자는 일곱 가지 기호를 사용합니다. I는 1, V는 5, X는 10, L은 50, C는 100, D는 500, M은 1,000입니다. 작은 기호가 큰 기호 앞에 오면 뺄셈을 나타냅니다. IV는 4, IX는 9입니다. 같은 규칙으로 XL은 40, XC는 90, CD는 400, CM은 900을 나타냅니다. 그리디 변환기는 이러한 조합 형식을 사용해 40을 XXXX처럼 잘못 반복해 표기하는 일을 막습니다.
Python에서 정수를 로마 숫자로 변환하기
다음 함수는 기호와 값을 큰 것부터 작은 것 순서로 저장합니다. 각 단계에서 남은 수가 해당 값 이상이면 기호를 결과에 붙이고 그 값을 뺍니다. 전체 매핑을 차례로 살펴보므로 필요한 경우 같은 값을 여러 번 사용할 수 있습니다. 일반적인 로마 숫자 입력 범위는 1–3,999입니다. 함수는 상한을 검사하지 않으므로 3,999보다 큰 수를 넣으면 M을 반복해 표준적이지 않은 숫자를 반환할 수 있습니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
roman_map = [
(1000, "M"), (900, "CM"), (500, "D"), (400, "CD"),
(100, "C"), (90, "XC"), (50, "L"), (40, "XL"),
(10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I"),
]
def into_roman(num=42):
result = ""
for value, symbol in roman_map:
while num >= value:
result += symbol
num -= value
return result
print(into_roman())
XLII
이 예제는 42를 XLII로 변환합니다. 먼저 매핑에서 40에 해당하는 XL을 사용하고, 남은 2를 I 두 개로 나타냅니다. 일반적인 범위에 있는 다른 값을 변환하려면 into_roman(num)에 양의 정수를 전달하세요. 함수의 while 루프는 같은 값이 여러 번 필요할 때 기호를 반복해서 붙이고, 바깥쪽 for 루프는 그다음으로 작은 값들을 살펴봅니다. 0이나 음의 정수를 입력하면 num이 0보다 큰 동안에만 처리하므로 빈 문자열을 반환합니다. 로마 숫자에는 0을 나타내는 표준 기호가 없으므로, 이런 입력을 거부해야 한다면 애플리케이션에서 범위를 검증하세요.
나눗셈으로 Python에서 정수를 로마 숫자로 변환하기
두 번째 방법은 정수 나눗셈과 나머지를 사용합니다. 같은 13개 값을 큰 것부터 작은 것 순서로 확인합니다. 각 값에 대해 num // value는 해당 기호를 몇 번 사용할 수 있는지 알려 주고, 나머지인 num % value는 다음 단계에서 처리할 값이 됩니다. 이 방법도 같은 로마 숫자를 만들며, 몫과 나머지가 어떻게 계산되는지 명시적으로 보여 줍니다. 첫 번째 함수와 마찬가지로 일반적인 범위인 1–3,999의 입력을 대상으로 하며 상한을 강제하지 않습니다. 3,999보다 큰 수를 넣으면 M을 반복해 표준적이지 않은 숫자를 반환할 수 있습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
roman_map = {
1000: "M", 900: "CM", 500: "D", 400: "CD",
100: "C", 90: "XC", 50: "L", 40: "XL",
10: "X", 9: "IX", 5: "V", 4: "IV", 1: "I",
}
order = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
def into_roman_by_division(num=42):
result = ""
for value in order:
quotient, num = divmod(num, value)
result += roman_map[value] * quotient
return result
print(into_roman_by_division())
XLII
42에서는 40 항목의 몫이 1이고 나머지는 2입니다. 이어서 1 항목이 I 두 개를 더해 결과가 XLII가 됩니다. 몫이 0인 경우에도 루프는 모든 값을 계속 확인하며, divmod가 다음 값에 사용할 나머지를 갱신합니다. 첫 번째 함수와 마찬가지로 이 구현도 양의 정수를 대상으로 합니다. 0을 넣으면 빈 문자열을 반환하고, 음의 정수에서는 Python의 내림 나눗셈이 로마 숫자의 뺄셈을 나타내지 않습니다. 외부 입력을 처리할 때는 두 함수 중 어느 쪽을 호출하기 전에 값이 지원 범위 안에 있는지 확인하세요.