Java初心者の競技プログラミング日記

Dvorak配列でjavaを書いてます

ローマ数字をアラビア数字に変換するメソッド

ローマ数字からアラビア数字に変換するメソッドと、アラビア数字からローマ数字に変換するメソッド。

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文だけで記述すれば実行速度も多少上がるのだろうが、書くのがめんどくさいのでやらない。