Pythonでローマ数字を整数に変換する方法を解説
ローマ数字とは
ローマ数字は、以下のような記号を使って数値を表現します。
| 記号 | 値 |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
ローマ数字の基本的なルール
ローマ数字の読み方を詳しく見てみましょう。たとえば「II」は2を表します。これは「I」が2つ足し合わされているためです。「XII」であれば X + II = 10 + 2 = 12 となります。
しかし、4は「IIII」ではなく「IV」と表記されます。ここが少し注意が必要なポイントです。ローマ数字には減算則と呼ばれる特別なルールがあります。
- 「I」は「V(5)」や「X(10)」の前に置かれると、それぞれ 4 と 9 を表します(IV = 4、IX = 9)
- 「X」は「L(50)」や「C(100)」の前に置かれると、それぞれ 40 と 90 を表します(XL = 40、XC = 90)
- 「C」は「D(500)」や「M(1000)」の前に置かれると、それぞれ 400 と 900 を表します(CD = 400、CM = 900)
変換プログラムの設計方針
今回は、1から3999までの数値に対応するローマ数字→整数コンバータを作成します。
解決策としては、まず基本の記号(I、V、X、L、C、D、M)に加えて、特殊な組み合わせ(IV、IX、XL、XC、CD、CM)も辞書に登録しておきます。次に、与えられた文字列を先頭から走査し、2文字分の部分文字列が辞書に存在するかどうかを優先的にチェックします。存在すればその値を結果に加算して2文字進み、存在しなければ1文字分の値を加算して1文字進みます。これを繰り返すことで、最終的な整数値が求まります。
Pythonでの実装例
class Solution(object):
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
roman = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,
'IV':4,'IX':9,'XL':40,'XC':90,'CD':400,'CM':900}
i = 0
num = 0
while i < len(s):
if i+1<len(s) and s[i:i+2] in roman:
num += roman[s[i:i+2]]
i += 2
else:
num += roman[s[i]]
i += 1
return num
ob1 = Solution()
print(ob1.romanToInt("III"))
print(ob1.romanToInt("CDXLIII"))入力
"III" "CDXLIII"
出力
3 443
コードのポイント
この実装のポイントは、辞書に減算則に基づく2文字の組み合わせ(IV、IX など)をあらかじめ登録しておくことです。文字列を左から順に処理し、まず2文字のマッチを試みることで、「IV」を「I」と「V」に分解せず、正しく4として扱えます。計算量は文字列長に対して線形時間 O(n) となり、非常に効率的です。
-
Pythonでfloat型を整数に変換する方法:int()関数の使い方
Pythonでfloatを整数に変換する基本の方法 Pythonには、float(浮動小数点数)オブジェクトを整数に変換するための組み込み関数 int() が用意されています。この関数にfloat型の値を渡すだけで、シンプルかつ手軽に整数へと変換できます。 >>> a = 10.56 >>> int(a) 10 int()関数の挙動:小数部分は「切り捨て」られる int() 関数は、小数部分を単純に切り捨てて整数を返します。四捨五入ではない点に注意しましょう。負の値の場合も、ゼロ方向へ丸められます。 >>> int(10.99) 10 &
-
Pythonで整数を文字に変換する方法|chr()関数の使い方を解説
Pythonのchr()関数とはPythonでは、組み込み関数 chr() を使うことで、整数を対応するUnicode文字に変換できます。引数として指定できる整数の範囲は、0から0x10FFFF(10進数で1,114,111)までです。この範囲はUnicodeで定義されているすべてのコードポイントをカバーしています。chr()関数の基本的な使い方chr() 関数は、引数に整数(コードポイント)を渡すと、その整数に対応する1文字の文字列を返します。>>> a = 100 >>> chr(a) d >>> chr(300) Ĭ >>