본문 바로가기
Problem Solving

[Hash Table] 로마숫자의 소인수

by Bokoo14 2022. 12. 13.
1보다 큰 양의 정수 N이 주어졌을 때, N의 소인수를 오름차순으로 출력하시오.
단, N은 로마 숫자로 주어지고, 소인수를 로마 숫자로 출력해야 한다.
예를 들어, 4620 = 2 * 2 * 3 * 5 * 7 * 11 이므로,
4620의 로마 숫자 MMMMDCXX 에 대해서 소인수의 오름차순으로II,II,III,V,VII,XI 을 차례대로 출력해야 한다.
Input
첫째 줄에 로마 숫자가 N이 하나 주어진다.
주어지는 숫자는 5,000 이하의 올바른 로마 숫이다.
MMMMDCXX

LXXVIII

DX
Output
첫째 줄부터 한 줄에 하나씩 N의 소인수를 로마 숫자로 출력한다.
II
II
III
V
VII
XI

II
III
XIII

II
III
V
XVII
import sys
input = sys.stdin.readline

ara = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000} # 로마숫자를 아라비아 숫자로
rom = {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 to_arabic(r):
    n = 0
    for i in range(len(r)):
        if (i<len(r)-1) and ara[r[i]]<ara[r[i+1]]:
            n-=ara[r[i]]
        else:
            n+=ara[r[i]]

    return n


# 아라비아 숫자를 로마 숫자로
def to_roman(a):
    nums = list(rom.keys())
    strs = list(rom.values())
    r = ""
    for i in range(len(rom)):
        while a >= nums[i]:
            r += strs[i]
            a -= nums[i]
    return r

# 소인수 분해
def factorization(arabic):
    d = 2
    while d<=arabic:
        if arabic%d==0:
            print(to_roman(d))
            arabic = arabic //d
        else:
            d = d+1


# 로마숫자가 주어지면, 아라비아 숫자로 바꾼다
arabic = to_arabic(input().strip())
factorization(arabic)

1. 로마숫자를 아라비아 숫자로 바꾼다

2. 소인수 분해를 한다

3. 출력은 로마 숫자로 출력