알고리즘 - 로마 숫자, 아라비아 숫자 변환

KDG·2021년 5월 18일
0

1. 로마 숫자를 아라비아 숫자로 바꾸기

* 문제

로마 숫자로 표기된 자연수 n(1n<4,000)n(1 \le n < 4,000)에 대하여, 다음과같이 아라비아 숫자로 변환해 보세요.

CCCLXIX, LXXX, XXIX, CLV, XIV, CDXCII, CCCXLVIII, CCCI, CDLXIX, CDXCIX
-> 369, 80, 29, 155, 14, 492, 348, 301, 469, 499

* 로마 숫자 표기법


가산표기법 : 기호의 값을 합산하는 방식 ex) III = 1+1+1 = 3
감산표기법 : 큰 수 앞에 작은 수를 놓으면 큰 수에서 작은 수를 빼는 방식 ex) IV = 5-1 = 4
로마 숫자는 가산표기법, 감산표기법 둘 다 사용



로마 숫자 표기법 함수로 구현

def getValueOf(symbol):
    if symbol == 'M': return 1000
    elif symbol == 'D': return 500
    elif symbol == 'C': return 100
    elif symbol == 'L': return 50
    elif symbol == 'X': return 10
    elif symbol == 'V': return 5
    elif symbol == 'I': return 1
    
roman = 'MDCLXVI'
for i in range(len(roman)):
    print(roman[i], ':', getValueOf(roman[i]))

로마 숫자 표기법 딕셔너리로 구현

romanDict = {'M':1000, 'D':500, 'C':100, 'L':50, 'X':10, 'V':5, 'I':1}

roman = 'MDCLXVI'
for i in range(len(roman)):
    print(roman[i], ':', romanDict[roman[i]])

딕셔너리를 사용하면 훨씬 간단하게 구현할 수 있다.


로마 숫자를 아라비아 숫자로 바꾸기

def toArabicNumber(roman):
    arabic = 0
    for i in range(len(roman)):
        value = romanDict[roman[i]]  # 로마 숫자에서 아라비아 숫자로 바꾼 값을 변수에 담는다.
        if i < len(roman)-1 and value < romanDict[roman[i+1]]:   # i가 마지막 글자인지 아닌지 확인하고, 마지막 글자가 아니면 다음 글자를 확인해 감산표기법을 사용해야 하는지 확인한다.
            arabic -= value   # 감산표기법을 사용해야 하면 -를 해준다.
            
        else:
            arabic += value   # 나머지는 다 더해준다.
    
    return arabic

romans = ['CCCLXIX', 'LXXX', 'XXIX', 'CLV', 'XIV', 'CDXCII', 'CCCXLVIII', 'CCCI', 'CDLXIX', 'CDXCIX']
arabics = []
for roman in romans:
    arabics.append(toArabicNumber(roman))
print(arabics)

->
[369, 80, 29, 155, 14, 492, 348, 301, 469, 499]



2. 아라비아 숫자를 로마 숫자로 바꾸기

* 문제

아라비아의 숫자로 표기된 자연수 nn에 대하여, 다음과 같이 로마 숫자로 표기해 보세요. (1n<4,000)(1 \le n < 4,000)

369, 80, 29, 155, 14, 492, 348, 301, 469, 499
-> CCCLXIX, LXXX, XXIX, CLV, XIV, CDXCII, CCCXLVIII, CCCI, CDLXIX, CDXCIX



아라비아 숫자를 로마 숫자로 바꾸기

romanDict = {1:'I', 4:'IV', 5:'V', 9:'IX', 10:'X', 40:'XL', 50:'L', 90:'XC', 100:'C', 400:'CD', 500:'D', 900:'CM', 1000:'M'}
keyValues = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]

def toRomanNumber(n):
    str = ""
    for i in range(len(keyValues)):
        while n >= keyValues[i]:     # keyValues의 값들을 하나씩 돌면서 n의 값을 확인하고 크면 반복문 실행
            str += romanDict[keyValues[i]]   # keyValues값에 해당되는 romanDict의 value값을 str에 더한다.
            n -= keyValues[i]   # 인자로 받은 n의 값을 keyValues값으로 뺀다. 그리고 0이 될 때 까지 반복
    
    return str

Q = [369, 80, 29, 155, 14, 492, 348, 301, 469, 499]

for i in Q:
    print(toRomanNumber(i), end=' ')
    
->
CCCLXIX LXXX XXIX CLV XIV CDXCII CCCXLVIII CCCI CDLXIX CDXCIX 






** 출처

0개의 댓글