로마에서 정수로

#13.로마에서 정수로

문제 설명



로마 숫자는 I , V , X , L , C , DM 의 7가지 기호로 표시됩니다.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000


예를 들어 2은 로마 숫자로 II으로 표기되며 1을 2개만 더하면 됩니다. 12XII 으로 작성되며 간단히 X + II 입니다. 숫자 27XXVII 으로 표기되며 XX + V + II 입니다.

로마 숫자는 일반적으로 왼쪽에서 오른쪽으로 큰 순서로 씁니다. 그러나 4의 숫자는 IIII이 아닙니다. 대신 숫자 4는 IV 으로 표시됩니다. 1이 5보다 앞에 있기 때문에 빼면 4가 됩니다. 같은 원리가 IX 으로 쓰여진 숫자 9에도 적용됩니다. 빼기가 사용되는 경우는 6가지입니다.
  • IV(5) 및 X(10) 앞에 배치하여 4와 9를 만들 수 있습니다.
  • XL(50) 및 C(100) 앞에 배치하여 40 및 90을 만들 수 있습니다.
  • CD(500) 및 M(1000) 앞에 배치하여 400 및 900을 만들 수 있습니다.

  • 로마 숫자가 주어지면 정수로 변환하십시오.

    예 1

    Input: s = "III"
    Output: 3
    Explanation: III = 3.
    


    예 2

    Input: s = "LVIII"
    Output: 58
    Explanation: L = 50, V= 5, III = 3.
    


    예 3

    Input: s = "MCMXCIV"
    Output: 1994
    Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
    


    설명



    給定一個羅馬數字將其轉換成阿拉伯數字,羅馬數字通常會從左到右、由大到小來撰寫,但有一特性,數字 4 不寫成 IIII 而是 IV ,因為 45 之前,所以用 V減去一個 I 得到 IV 也就是等於 4 .

    相同原則下也是適用於 9 ,轉換成羅馬數字為 IX ,題目也提供了六種使用這種減法的案例.

    해결책


  • 先過濾特定條件,判斷字串 s 是否為空字串或是 null ,如果成立則返回 0
  • 接著將羅馬符號對應的數字分別裝進 Dictionary 供後續轉換使用
  • 建立一個 counter 變數儲存加總,並先 할당 s0 個索引轉換後的值
  • 迴圈走訪字串內的從所有字符(除了第一個字),用一個 If Statements 來判斷是加法還是減法,正常原則是由大到小,所以條件可設為這次的羅馬符號大於上次則為減法
  • 條件成立:加總這次轉換的數值
  • 條件不成立:邏輯是減去上次加總的,再加上這次的數值減去上次的數值

  • 最後返回結果 카운터

  • public int RomanToInt(string s)
    {
        if (s == null || s == String.Empty)
            return 0;
    
        IDictionary dic = new Dictionary<char, int>
        {
            { 'I', 1 },
            { 'V', 5 },
            { 'X', 10 },
            { 'L', 50 },
            { 'C', 100 },
            { 'D', 500 },
            { 'M', 1000 }
        };
    
        int counter = (int)dic[s[0]];
    
        for (int i = 0; i < s.Length; i++)
        {
            if ((int)dic[s[i - 1]] >= (int)dic[s[i]])
                counter += (int)dic[s[i]];
            else
            {
                counter += (int)dic[s[i]] - (int)dic[s[i - 1]] * 2;
            }
        }
    
        return counter;
    }
    



    참조



    LeetCode Solution

    GitHub Repository


    글 읽어주셔서 감사합니다 🌷 🌻 🌼

    마음에 드셨다면 주저말고 하트 꾸욱 눌러주세요❤️
    또는 내 Leetcode 솔루션에서 좋아요를 클릭하세요.
    또는 내 GitHub 팔로우 ⭐
    또는 커피를 사주세요 ⬇️ 감사합니다.

    좋은 웹페이지 즐겨찾기