97 로마자-십진수 변환기 (Roman to Decimal Converter)
십진수를 로마자로, 또는 로마자를 십진수로 변환해 주는 스크립트를 작성해 봅시다. 단순한 작업처럼 보일 수 있지만, 로마자의 복잡한 규칙(감산 표기법 등)을 처리하는 과정은 의외로 까다롭고 재미있는 도전이 될 것입니다.
이 프로젝트는 문자열 분석과 조건별 알고리즘 설계, 그리고 데이터 매핑(Mapping) 기술을 익히기에 아주 좋습니다. 특히 로마자의 역사적인 표기법과 현대적인 규칙을 모두 만족하는 견고한 변환기를 직접 설계해 보세요.
97.1 주요 개발 포인트
- 로마자 기호 매핑: I(1), V(5), X(10), L(50), C(100), D(500), M(1000) 등 각 기호의 값을 정의합니다.
- 감산 표기법 처리 (Subtractive Notation): IV(4), IX(9), XL(40), XC(90) 등 앞의 숫자가 뒤의 숫자보다 작을 때 뺄셈을 수행하는 로직을 구현합니다.
- 십진수에서 로마자로의 역변환: 큰 숫자부터 차례대로 로마자로 변환하여 전체 문자열을 구성합니다.
- 입력 유효성 검사 (Validation): 잘못된 형식의 로마자(예: IIII, VV 등)가 입력되었을 때 오류를 감지하고 처리합니다.
- 사용자 인터페이스 (GUI): 변환하려는 숫자나 문자를 입력하고 실시간으로 결과를 확인하는 UI를 구축합니다.
97.2 Python 구현 예시 (간단한 로마자에서 십진수로의 변환 로직)
def roman_to_decimal(roman):
"""
로마자 문자열을 받아서 해당하는 십진수 정수를 반환합니다.
"""
roman_map = {
'I': 1, 'V': 5, 'X': 10, 'L': 50,
'C': 100, 'D': 500, 'M': 1000
}
total = 0
prev_value = 0
# 뒤에서부터 거꾸로 순회하며 계산하는 것이 더 효율적일 수 있습니다.
for char in reversed(roman.upper()):
curr_value = roman_map.get(char, 0)
# 현재 값이 이전 값보다 작으면 뺍니다 (예: IV -> 5-1=4)
if curr_value < prev_value:
total -= curr_value
print(f"감산 발생: {char}({curr_value})를 뺍니다.")
else:
total += curr_value
print(f"가산 발생: {char}({curr_value})를 더합니다.")
prev_value = curr_value
print(f"\n최종 변환 결과: {roman} -> {total}")
return total
if __name__ == "__main__":
# 로마자 변환 테스트
test_roman_1 = "XIV" # 14
test_roman_2 = "MCMLXXXVIII" # 1988
roman_to_decimal(test_roman_1)
roman_to_decimal(test_roman_2)