【Python】ローマ数字を整数値に変換する【LeetCode】

スポンサーリンク

【Python】ローマ数字を整数値に変換する【LeetCode】

IIIIVなどのローマ数字を整数値に変換する方法をまとめておく。

IIIは3、IVは4といった用に文字列が入力されたときに数値を返すような関数を作る。

Roman to Integer - LeetCode
Can you solve this real interview question? Roman to Integer - Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol ...

ローマ数字と値の対応

ローマ数字と値の対応関係はこのようになっている。

基本的に値の大きい文字が左側にくる。

例えば、

Input: s =  "MC"
Output: 1100

ただし、値の小さい文字が左側にくることもある。

例えば、

Input: s = "IV"
Output: 4

この場合にも対応する必要がある。

対応関係を表す辞書を作成

ローマ数字と値の組を表す辞書を作成する。

dict = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}

文字列を右端から読んでいく

文字列を右端から読んでいって、左の文字の方が小さかったら、その文字に対応する値は足すのではなく引く。

sum = 0
y = 0 # 比較用の変数
for i in s[::-1]: # sは入力された文字列のこと
    if y <= dict[i] or y == 0:
        sum += dict[i]
        y = dict[i]
    else:
        sum -= dict[i]
return sum

こんなに簡単に書けてしまう。

右端から読んで足すのか引くのかを選択するという考えが出てくれば書けてしまうコード。

ちなみに自分のコードは…

自分は↑のように右から読んでいくという考えが出なかったので左から地道に読んだ。

自分が書いたコードは↓

def romanToInt(self, s):

        dict = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        
        sum = 0
        idx = 0
        if len(s) == 1:
            return dict[s]
        
        else:
            for i in range(len(s)):
                if idx+1 < len(s):
                    if dict[s[idx]] >= dict[s[idx+1]]:
                        sum += dict[s[idx]]
                        idx += 1
                    elif s[idx] == 'I' and s[idx+1] == 'V':
                        sum += 4
                        idx += 2
                    elif s[idx] == 'I' and s[idx+1] == 'X':
                        sum += 9
                        idx += 2
                    elif s[idx] == 'X' and s[idx+1] == 'L':
                        sum += 40
                        idx += 2
                    elif s[idx] == 'X' and s[idx+1] == 'C':
                        sum += 90
                        idx += 2
                    elif s[idx] == 'C' and s[idx+1] == 'D':
                        sum += 400
                        idx += 2
                    elif s[idx] == 'C' and s[idx+1] == 'M':
                        sum += 900
                        idx += 2
                elif idx+1 == len(s):
                    sum += dict[s[idx]]
                    return sum
                else:
                    return sum

処理は遅いけど求めることはできる。

左の文字から順に見ていって値を足していくというごく単純なものです。
でもコードがかなり長くなってしまう笑。

人気記事

人気記事はこちら。

CUDA、cuDNNのバージョンをターミナルで調べるコマンド
【Pytorch】テンソルを連結する方法(cat・stack)
【Pytorch】テンソルの次元を追加・削除する方法【dim】
【Protobuf】"TypeError: Descriptors cannot not be created directly."を解決する【solved】
【Python】Tensorflowをダウングレード・アップグレードするコマンド

新着記事

新着記事はこちら。

寿司打記録更新
【インド】バンガロールの5つ星ホテルに宿泊。Four Seasons Hotel
【インド】ハイデラバードからバンガロールへ移動
Ubuntu20.04でRealSenseの環境構築を行う。realsense-rosも。コマンド。
インド工科大学ハイデラバード校を訪問。宿泊も。
タイトルとURLをコピーしました