[leetcode] Roman to Integer


与えられたローマ数字文字列を整数に変換する問題.
ローマ数字ごとに次の値が表示されます.
ローマ数字I 1 V 5 X 10 L 50 C 100 D 500 M 1000
そして、問題点から見ると、次のような条件があります.
I can be placed before V (5) and X (10) to make 4 and 9.
X can be placed before L (50) and C (100) to make 40 and 90.
C can be placed before D (500) and M (1000) to make 400 and 900.
すなわち,VIIが7,IVが4であると仮定すると,小さな数字が大きな数字の前に現れると,マイナス記号の役割を果たす.
例えば、LXは60であるが、XLは40まで読み取ることができる.
この問題に対して,HashMapには各文字が表す数字がマッピングされ,前ローマ数字が後ローマ文字より大きい場合には,小さい場合に応じて符号を変更して加算する形で解く.
class Solution {
    public int romanToInt(String s) {
        Map<String, Integer> romans = new HashMap<>();
        
        romans.put("I", 1);
        romans.put("V", 5);
        romans.put("X", 10);
        romans.put("L", 50);
        romans.put("C", 100);
        romans.put("D", 500);
        romans.put("M", 1000);
        
        String[] strs = s.split("");
        int result = romans.get(strs[strs.length-1]);
        int sign = 1;
        for(int i = strs.length-1; i>0; i--) {
            int now = romans.get(strs[i]);
            int next = romans.get(strs[i-1]);
            if(now > next) {
                sign = -1;
            } else if(now < next) {
                sign = 1;
            }
            result+=next*sign;
        }
        
        return result;
    }
}