結果

問題 No.518 ローマ数字の和
ユーザー yuppe19 😺yuppe19 😺
提出日時 2017-05-28 22:24:50
言語 Python2
(2.7.18)
結果
AC  
実行時間 14 ms / 2,000 ms
コード長 1,279 bytes
コンパイル時間 58 ms
コンパイル使用メモリ 6,940 KB
実行使用メモリ 6,912 KB
最終ジャッジ日時 2024-09-21 15:35:15
合計ジャッジ時間 1,314 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 13 ms
6,912 KB
testcase_01 AC 13 ms
6,912 KB
testcase_02 AC 12 ms
6,784 KB
testcase_03 AC 12 ms
6,912 KB
testcase_04 AC 12 ms
6,784 KB
testcase_05 AC 12 ms
6,784 KB
testcase_06 AC 12 ms
6,912 KB
testcase_07 AC 12 ms
6,912 KB
testcase_08 AC 12 ms
6,912 KB
testcase_09 AC 12 ms
6,784 KB
testcase_10 AC 13 ms
6,784 KB
testcase_11 AC 12 ms
6,912 KB
testcase_12 AC 13 ms
6,784 KB
testcase_13 AC 13 ms
6,912 KB
testcase_14 AC 12 ms
6,912 KB
testcase_15 AC 14 ms
6,912 KB
testcase_16 AC 12 ms
6,912 KB
testcase_17 AC 12 ms
6,912 KB
testcase_18 AC 12 ms
6,784 KB
testcase_19 AC 12 ms
6,912 KB
testcase_20 AC 12 ms
6,912 KB
testcase_21 AC 12 ms
6,912 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#!/usr/bin/python2
# -*- coding: utf-8 -*-
# †
from collections import namedtuple
from itertools import groupby
T = namedtuple('T', 'num, cnt')

v = ['IV', 'XL', 'CD', 'M-']
num_letter = {10**i * [1,5][j]: ch for i, s in enumerate(v) for j, ch in enumerate(s)}
letter_num = {v: k for k, v in num_letter.items()}

def create(n):
    arr = []
    d = 0
    while n > 0:
        x = n % 10
        if x == 9:
            arr.append(v[d][0] + v[d+1][0])
        elif x == 4:
            arr.append(v[d])
        else:
            p, q = divmod(x, 5)
            arr.append(v[d][1] * p + v[d][0] * q)
        n //= 10
        d += 1
    arr = [s.replace('M-', 'MMMM') for s in arr]
    return ''.join(reversed(arr))

def parse(s):
    grp = [T(k, len(list(g))) for k, g in groupby(letter_num[ch] for ch in s)]
    n = len(grp)
    i = 0
    res = 0
    while i < n:
        if i+1 < n and grp[i].num < grp[i+1].num:
            assert grp[i].cnt == 1 and grp[i+1].cnt == 1
            res += grp[i+1].num - grp[i].num
            i += 1
        else:
            res += grp[i].num * grp[i].cnt
        i += 1
    return res


###
n = int(raw_input())
line = raw_input()
summ = sum(map(parse, line.split()))
if summ > 3999:
    print 'ERROR'
    exit(0)
res = create(summ)
print res
0