[Python] 백준 2608_로마숫자

채수빈·2021년 12월 21일
1

백준 알고리즘

목록 보기
6/21

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

주어진 두개의 로마숫자를 더하여 아라비아 숫자로 표현하고, 그 아라비아 숫자를 다시 로마숫자로 표현하여 출력하는 문제이다.
로마숫자를 아라비아 숫자로 변환해주는 to_num(s)함수와 아라비아 숫자를 로마숫자로 변환해주는 to_str(n)함수를 구현해주었다.

  1. to_num(s)함수
    딕셔너리를 이용하여 s의 인덱스별로 해당 문자(키)가 가지는 값을 num 변수에 계속 더해주는 과정을 반복하여 모든 인덱스를 다 확인하면 num값을 반환해준다.
  2. to_str(n)함수
    구현 방법이 떠오르지 않아 if문으로 일일히 문자를 확인해주고 문자를 s라는 변수에 계속 더해가면서 답을 구해주는 방식이다. 더 효율적인 방법이 있을 것 같아서 아쉬운 코드이다.

코드

import sys
input =sys.stdin.readline

s1 = input().strip()
s2 = input().strip()

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

#문자->숫자 
def to_num(s):
    l=len(s) #문자열 길이
    num =0 #결과값 저장 
    visited = [0]*l
    for i in range(l):
        if visited[i]==0: #아직 방문 x
            if i+1<len(s) and s[i:i+2] in sign2.keys(): #작은 숫자가 큰 숫자의 왼쪽에 오는 경우
                visited[i], visited[i+1] =1,1
                num += int(sign2[s[i:i+2]])
            else:
                visited[i]=1
                num+=int(sign[s[i]])
    return num

#숫자->문자            
def to_str(n):
    s=""
    while n>0:
        if n>=1000:
            s+="M"
            n-=1000
        elif n>=900:
            s+="CM"
            n-=900
        elif n>=500:
            s+="D"
            n-=500
        elif n>=400:
            s+="CD"
            n-=400
        elif n>=100:
            s+="C"
            n-=100
        elif n>=90:
            s+="XC"
            n-=90
        elif n>=50:
            s+="L"
            n-=50
        elif n>=40:
            s+="XL"
            n-=40
        elif n>=10:
            s+="X"
            n-=10
        elif n>=9:
            s+="IX"
            n-=9
        elif n>=5:
            s+="V"
            n-=5
        elif n>=4:
            s+="IV"
            n-=4
        elif n>=1:
            s+="I"
            n-=1
    return s

nresult = to_num(s1)+to_num(s2)
print(nresult)
print(to_str(nresult))
profile
웹 프로그래밍과 알고리즘 공부👩🏻‍💻

0개의 댓글