본문 바로가기
{ Problem Solving }/Implementation

[구현] 백준 2608번: 로마 숫자 / 실버1

by ggyongi 2021. 7. 15.
반응형

https://www.acmicpc.net/problem/2608

 

2608번: 로마 숫자

첫째 줄과 둘째 줄에 하나씩 로마 숫자로 표현된 수가 주어진다. 입력된 각 수는 2000 보다 작거나 같고, 두 수의 합은 4000보다 작다.

www.acmicpc.net

input1 = input()
input2 = input()

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

dct2 = {
    'IV': 4, 'IX': 9, 'XL': 40,
    'XC': 90, 'CD': 400, 'CM': 900
}

def toArab(rome):
    idx = 0
    num = 0
    while idx < len(rome):
        cur = rome[idx]
        if cur in 'IXC' and idx != len(rome)-1:
            next = rome[idx+1]
            if cur+next in dct2:
                num += dct2[cur+next]
                idx += 2
                continue
        num += dct1[cur]
        idx += 1
    return num

def toRome(num):
    rome = ""
    arab = [x for x in str(num)]
    pos = len(arab)-1
    lst = ['I', 'X', 'C', 'M']  # 1, 10, 100, 1000
    lst2 = ['V', 'L', 'D']     # 5,50,500
    lst3 = ['IV', 'XL', 'CD']  # 4 40 400
    lst4 = ['IX', 'XC', 'CM']  # 9 90 900
    while arab:
        c = arab.pop(0)
        if c == '4':  # special case
            rome += lst3[pos]
        elif c == '9':
            rome += lst4[pos]
        elif c in '123':  # less than 5
            for _ in range(int(c)):
                rome += lst[pos]
        elif c in '5678':  # bigger than 5
            rome += lst2[pos]
            if c != '5':
                for _ in range(int(c)-5):
                    rome += lst[pos]
        pos -= 1
    return rome

arab_num = toArab(input1)+toArab(input2)
print(arab_num)
print(toRome(arab_num))
 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글