LetCode 13 Roman to Integer(로마 정수)

6501 단어 LeetCode코드itClass
번역하다
        ,         。

      1 3999  。

원문
Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

처음부터 구상을 못했고 지난 문제대로 갈 수 있었지만 결과는 내 밑에서처럼.. 코드가 엉망진창이었어...
public class Solution
{
    public int RomanToInt(string s)
    {
        int result = 0;
        Type R = typeof(Roman);
        string first, second;
        if (s.Length > 1)
        {
            first = s.Substring(0, 1); second = s.Substring(0, 2);
        }
        else
        {
            first = s.Substring(0, 1); second = "";
        }
        foreach (var r in Enum.GetNames(R).Reverse())
        {
            while ((r.Length == 1 && first == r) || (r.Length == 2 && second == r))
            {
                result += int.Parse(Enum.Format(R, Enum.Parse(R, r), "d"));
                int lenR = r.Length, lenS = s.Length;
                if (lenS - lenR < 1)
                    s = "";
                else
                    s = s.Substring(lenR, lenS - lenR);

                if (s.Length > 1)
                {
                    first = s.Substring(0, 1); second = s.Substring(0, 2);
                }
                else if (s.Length == 1)
                {
                    first = s.Substring(0, 1); second = "";
                }
                else
                {
                    first = ""; second = "";
                }
            }
        }
        return result;
    }

}

public enum Roman
{
    M = 1000,
    CM = 900,
    D = 500,
    CD = 400,
    C = 100,
    XC = 90,
    L = 50,
    XL = 40,
    X = 10,
    IX = 9,
    V = 5,
    IV = 4,
    I = 1
};

비록 운행할 수 있지만...... 효율도 너무 낮아서 똑바로 볼 수가 없어...그래서 다른 신들처럼 공부를 했어요...
아래의 코드는 나를 깊이 감동시켰다. 수조는 수조의 색인으로서... 내가 가장 자주 사용하지 않는 용법이다.
class Solution {
public:
    int romanToInt(string s) {
        unordered_map<char, int> map = {{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}};
        int ret = 0;
        for (int idx = 0; idx < s.size(); ++idx) {
            if ((idx < s.size()-1) && (map[s[idx]] < map[s[idx+1]])) {
                ret -= map[s[idx]];
            }
            else {
                ret += map[s[idx]];
            }
        }
        return ret;
    }
};

이 알고리즘은 로마 숫자 두 숫자의 전후 순서의 관계를 충분히 이용했다. 즉, I가 V 앞에 있으면 IV이고 4를 대표하며 반대로 6을 대표한다.C++의 unorderedmap, 교묘하게 수조를 통해 판단하여ret에 대한 가감 또는 감축의 목적을 달성할 수 있다.
잘 느껴야겠어..

좋은 웹페이지 즐겨찾기