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. 출력은 로마 숫자로 출력
'Problem Solving' 카테고리의 다른 글
[Hash Table] 에너그램 정렬 (0) | 2022.12.13 |
---|---|
[Hash Table] 수평선과 수직선 (0) | 2022.12.13 |
[Hash Table] 과일 가게: 많이 팔린 순서로 정렬 (0) | 2022.12.13 |
[Hash Table] 과일가게: 가장 많이 팔린 과일 (0) | 2022.12.13 |
[Queue] 카드 버리기 (0) | 2022.12.13 |