【競技プログラミング】「Roman To Integer」with Python | LeetCode #13

Python

こちらは「Roman To Integer」のPythonによる解答例となっております。この問題は、ローマ数字が与えられたときに、それを整数に変換する問題です。

問題

ローマ数字が与えられたとき、それを整数に変換して返します。

  • s は、ローマ数字で表された文字列で、長さは 1 以上 15 以下です。
  • s の文字は、'I''V''X''L''C''D''M' から成ります。
  • s は、次のいずれかの形式になっています。
    • 1 <= s.length <= 15
    • s[i]: ‘I’, ‘V’, ‘X’, ‘L’, ‘C’, ‘D’, ‘M’
  • 1 <= ans <= 3999

解法

この問題は、ローマ数字を整数に変換することが求められています。基本的な考え方は、ローマ数字を一つずつ処理して、対応する数値を足し合わせることです。

アルゴリズムの概要を以下に述べます。

  1. ローマ数字と整数の対応表を作成します。
  2. 特定のローマ数字の表記を整数に変換するために、ローマ数字を操作します。
  3. 入力されたローマ数字を一つずつ処理して、対応する数値を足し合わせます。

Pythonコード

以下のコードが、「Roman to Integer」を解くためのPythonプログラムとなります。

### Function ##################################################################

def solve(num=0):
    
    solver  = Solution().romanToInt
    
    if 1 <= num <= Input().input: id_LIST = [num]
    else: id_LIST = [id+1 for id in range(Input().input)]
    
    for id in id_LIST:
        data    = Input(id)
        ans     = solver(data.s)
        result  = "OK" if ans==data.ans else "NG"
        print(f"[{str(id).zfill(3)}] {result}")

### Class #####################################################################

class Solution(object):
    def romanToInt(self, s):
        """
        :type s: str
            1 <= s.length <= 15
            s[i]: 'I', 'V', 'X', 'L', 'C', 'D', 'M'
        :rtype: int
            1 <= ans <= 3999
        """
        
        romanToInt_DICT = {
            "I": 1,
            "V": 5,
            "X": 10,
            "L": 50,
            "C": 100,
            "D": 500,
            "M": 1000
        }
        
        s = s.replace("IV", "IIII")     ### 4
        s = s.replace("IX", "VIIII")    ### 9
        s = s.replace("XL", "XXXX")     ### 40
        s = s.replace("XC", "LXXXX")    ### 90
        s = s.replace("CD", "CCCC")     ### 400
        s = s.replace("CM", "DCCCC")    ### 900
        
        number = 0
        for char in s:
            number += romanToInt_DICT[char]
        
        return number

#==============================================================================

class Input:
    
    def __init__(self, num=0):
        
        if num == 1:
            self.s = "III"
            self.ans = 3
        
        elif num == 2:
            self.s = "LVIII"
            self.ans = 58

        elif num == 3:
            self.s = "MCMXCIV"
            self.ans = 1994
        
        else:
            self.input  = 3

### Main ######################################################################

if __name__ == "__main__":

    solve()

###############################################################################