Pythonでローマ数字を整数に変換する方法をわかりやすく解説
ローマ数字で表された文字列を受け取り、それを整数値に変換するプログラムをPythonで作成してみましょう。
ローマ数字は、基本的に大きな値の記号から小さな値の記号へと左から右へ並べられます。ただし、例外的なケースとして「ある記号が1つ小さい値を表す」場合には、小さい記号が大きい記号の前に置かれます(例:IV = 4)。
ローマ数字の各記号と対応する数値
'M':1000
'D':500
'C':100
'L':50
'X':10
'V':5
'I':1
たとえば、入力が numeral = "MCLXVI" の場合、出力は 1166 になります。これは M = 1000、C = 100 で合計1100、続いて L = 50、X = 10、VI = 6 を加えて合計1166となるためです。
解決の手順
この問題は、以下のアルゴリズムで解くことができます。
上記の記号と数値の対応表(辞書)を用意する
答えを格納する変数 ans を 0 で初期化する
n に文字列 numeral の長さを代入する
文字列の各インデックス idx と文字 c について以下を繰り返す:
idx が n - 1 未満であり、かつ d[c] < d[numeral[idx + 1]](現在の記号の値が次の記号の値より小さい)場合は、ans から d[c] を引く
それ以外の場合は、ans に d[c] を加える
最後に ans を返す
ポイントは、「小さい値の記号が大きい値の記号の前に来ている場合(IVやIXなど)は減算する」というルールです。隣接する次の文字と比較することで、この例外処理をシンプルに実装できます。
Pythonでの実装例
実際のコードを見てみましょう。
class Solution:
def solve(self, numeral):
d = {"M": 1000, "D": 500, "C": 100, "L": 50, "X": 10, "V": 5, "I": 1}
ans = 0
n = len(numeral)
for (idx, c) in enumerate(numeral):
if idx < n - 1 and d[c] < d[numeral[idx + 1]]:
ans -= d[c]
else:
ans += d[c]
return ans
ob = Solution()
numeral = "MCLXVI"
print(ob.solve(numeral))
入力
"MCLXVI"
出力
1166
計算量について
このアルゴリズムは文字列を一度だけ走査するため、時間計算量は O(n)、必要な追加メモリは記号対応表のみなので空間計算量は O(1) となります。非常に効率的な実装です。
-
Pythonでキロメートルをマイルに変換する方法|初心者向けサンプルコード付き解説
本記事では、Pythonを使って「キロメートル(km)」を「マイル(mile)」に変換するプログラムの作成方法を、初心者にもわかりやすく解説します。課題の概要今回扱う問題は次のとおりです。問題文: キロメートル単位で与えられた距離を、マイル単位に変換して出力する。変換には以下の換算式を使用します。1キロメートル = 0.621371 マイル使用する変換公式Miles = kilometer * 0.621371つまり、キロメートルの値に定数「0.621371」を掛けるだけで、マイルへの換算が可能です。それでは、実際のコードを見てみましょう。実装例kilometers = 5.5 # 換算係数:
-
Pythonで16進数の文字列を10進数に変換する方法を解説
この記事では、16進数の文字列を10進数に変換する問題の解決策について詳しく解説します。課題の概要16進数形式の文字列が与えられたとき、それを対応する10進数の値に変換することを目標とします。例えば、16進数の「F」は10進数では「15」に相当します。この問題には主に2つのアプローチがあります。力ずく(ブルートフォース)な手法:int関数を使った明示的な型変換組み込みモジュールを活用する手法:astモジュールのliteral_eval関数を使用方法1:int関数を使った変換最もシンプルで一般的な方法は、Pythonの組み込み関数であるint()を利用するものです。この関数は2つの引数を受け取り