Problem:
ローマ数字

古代ローマでは数を数えることは難しい仕事でした。アラビア数字の 0,1,2,3,…, 9 はまだ流布していませんでした。その代わり次のような記号が使われていました。

アラビア数字

ローマ数字

アラビア数字

ローマ数字

アラビア数字

ローマ数字

1

I

11
XI

30

XXX

2

II

12
XII

40

XL

3

III

13
XIII

50

L

4

IV

14
XIV

60

LX

5

V

15
XV

70

LXX

6

VI

16
XVI

80

LXXX

7

VII

17
XVII

90

XC

8

VIII

18
XVIII

100

C

9

IX

19
XIX

500

D

10

X

20
XX

1000

M

I は 1、 V は 5、 X は 10、 L は 50、 C は 100、 D は 500、 M は 1000、 他の例は上の表を見てください。小さい数が大きい数に続いている、つまり右側にあるときは足し算をします。小さい数が大きい数の前に、つまり左にあるときは、大きい数から小さい数を引きます。大きい数字の前にあって引き算を表す小さな数字は一回の引き算あたりひとつしかありません。

ローマ数字をアラビア数字（通常の数字）の表記（10 進表示）に変換して出力するプログラムを作成してください。ただし、与えられるローマ数字は上記のルールにのみ従っています(実際のローマ数字の表記にはもっと細かいルールがありますが、ここでは考慮する必要はありません。たとえば、実際のローマ数字ではI はV かX から、X はL かC から、C はD かM からしか引き算しませんし、同じローマ数字は４つ以上（または５つ以上）足し並べることはありません。)

Input

複数のデータセットが与えられます。それぞれのデータセットにローマ数字（半角大文字のI, V, X, L, C, D ,M で表される連続した文字列）が１行に与えられます。与えられるローマ数字の文字列の長さはおのおの 100 以下です。

データセットの数は 50 を超えません。

Output

各データセットに対し、アラビア数字（整数）を１行に出力して下さい。

Sample Input

IV
CCCCLXXXXVIIII
CDXCIX

Output for the Sample Input

4
499
499

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _0039
{
    public class Program

    {
        public static void Main(string[] args)
        {
            Dictionary<char, int> roman = new Dictionary<char, int>()
            {
                 {'I',1}
                ,{'V',5}
                ,{'X',10}
                ,{'L',50}
                ,{'C',100}
                ,{'D',500}
                ,{'M',1000}
            };

            while (true)
            {
                string line = Console.ReadLine();
                if (string.IsNullOrEmpty(line)) return;

                int res = 0;
                for (int i = 0 ; i < line.Length - 1 ; i++)
                {
                    if(roman[line[i]] < roman[line[i + 1]]) res -= roman[line[i]];
                    else res += roman[line[i]];

                }
                res += roman[line[line.Length - 1]];
                Console.WriteLine(res);
            }

        }

        static string RSt() { return Console.ReadLine(); }
        static int RInt() { return int.Parse(Console.ReadLine().Trim()); }
        static long RLong() { return long.Parse(Console.ReadLine().Trim()); }
        static double RDouble() { return double.Parse(Console.ReadLine()); }
        static string[] RStAr(char sep = ' ') { return Console.ReadLine().Trim().Split(sep); }
        static int[] RIntAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => int.Parse(e)); }
        static long[] RLongAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => long.Parse(e)); }
        static double[] RDoubleAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => double.Parse(e)); }
        static string WAr<T>(IEnumerable<T> array, string sep = " ") { return string.Join(sep, array.Select(x => x.ToString()).ToArray()); }
    }

}