ローマ数字をアラビア数字に変換するメソッド
ローマ数字からアラビア数字に変換するメソッドと、アラビア数字からローマ数字に変換するメソッド。
static int RomanToArabic (String s) { String[] a = {"IV","IX","XL","XC","CD","CM"}; String[] b = {"IIII","VIIII","XXXX","LXXXX","CCCC","DCCCC"}; for (int j=0; j<6; j++) { s = s.replaceAll(a[j],b[j]); } int n = 0; int[] number = {1000,900,500,400,100,90,50,40,10,9,5,4,1}; String[] roma = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; for (int i=0; i<s.length(); i++) { for (int j=0; j<13; j++) { if (s.substring(i,i+1).equals(roma[j])) {n += number[j];} } } if (n > 3999) {return -1;} else {return n;} } static String ArabicToRoman (int n) { if (n<0 || 3999<n) {return "error";} int[] number = {1000,900,500,400,100,90,50,40,10,9,5,4,1}; String[] roma = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; StringBuilder ans = new StringBuilder(); for (int i=0; i<13; i++) { int ii = n/number[i]; for (int j=0; j<ii; j++) { ans.append(roma[i]); } n = n%number[i]; } return ans.toString(); }
ローマ数字からアラビア数字に変換するメソッド(RomanToArabic)については、引数の例外処理をしていないので、ローマ数字の規則から外れた文字列(XXXXXXXXXX)を渡しても、正しく変換されてしまう(100)ので注意が必要。
メソッドの中にこんなに配列を入れたら、メモリ消費量が上がってしまうような気がするが、もし気になるなら、配列をstaticにしてメソッドの外へ出してやることで、メモリ消費量も多少抑えられるのではないかと思う。
以下、このメソッドの使用例。
#237637 No.518 ローマ数字の和 - yukicoder
追記:やはり配列をメソッドの外に出さないと、メモリ消費量ではなく実行速度がかなり落ちるようなので、TLEを気にするなら配列を外に出すべきだ。配列を使わずif文だけで記述すれば実行速度も多少上がるのだろうが、書くのがめんどくさいのでやらない。