結果

問題 No.518 ローマ数字の和
ユーザー 1ip
提出日時 2018-02-24 01:35:15
言語 Java
(openjdk 23)
結果
AC  
実行時間 58 ms / 2,000 ms
コード長 4,917 bytes
コンパイル時間 3,902 ms
コンパイル使用メモリ 80,996 KB
実行使用メモリ 37,016 KB
最終ジャッジ日時 2024-10-10 20:48:28
合計ジャッジ時間 5,959 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 19
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

package yukicoder;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;
public class No518 {
public static void main(String[] args) throws IOException {
start();
// roman2num("CDXLIV");
}
private static void start() throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
// 使
in.readLine();
// N
String romanStr = in.readLine();
List<String> romans = Arrays.asList(romanStr.split(" "));
int value = 0;
//
for (String roman : romans) {
int num = roman2num(roman);
// System.out.println("debug:" + num);
value += num;
}
// System.out.println("debug:value=" + value);
//
String output = num2roma(value);
//
System.out.println(output);
}
/**
*
*
* @param roman
* @return
*/
private static int roman2num(String roman) {
int value = 0;
//
for (int index = 0; index < roman.length(); index++) {
String romanElement = String.valueOf(roman.charAt(index));
if (index + 1 < roman.length()) {
//
String pair = roman.substring(index, index + 2);
switch (pair) {
case "CM":
value += 900;
index++;
break;
case "CD":
value += 400;
index++;
break;
case "XC":
value += 90;
index++;
break;
case "XL":
value += 40;
index++;
break;
case "IX":
value += 9;
index++;
break;
case "IV":
value += 4;
index++;
break;
default:
value += romanElem2num(romanElement);
break;
}
} else {
value += romanElem2num(romanElement);
}
}
return value;
}
/**
*
*
* @param romanElement
* @return
*/
private static int romanElem2num(String romanElement) {
switch (romanElement) {
case "I":
return 1;
case "V":
return 5;
case "X":
return 10;
case "L":
return 50;
case "C":
return 100;
case "D":
return 500;
case "M":
return 1000;
default:
throw new IllegalArgumentException("" + romanElement);
}
}
/**
*
*
* @param value
* @return
*/
private static String num2roma(int value) {
if (value > 3999) {
return "ERROR";
}
StringBuilder romanSB = new StringBuilder("MMMCMXCIX".length());
// M(1000)
int numM = value / 1000;
for (int m = 0; m < numM; m++) {
romanSB.append("M");
value -= 1000;
}
if (value == 0) {
return romanSB.toString();
}
// D(500)
int numD = value / 500;
// C4
if (numD == 1) {
// D
int remainderD = value - (numD * 500);
if (remainderD / 100 == 4) {
romanSB.append("CM");
value -= 900;
} else {
romanSB.append("D");
value -= 500;
}
}
if (value == 0) {
return romanSB.toString();
}
// C(100)
int numC = value / 100;
// C4
if (numC == 4) {
romanSB.append("CD");
value -= 400;
} else {
for (int c = 0; c < numC; c++) {
romanSB.append("C");
value -= 100;
}
}
if (value == 0) {
return romanSB.toString();
}
// L(50)
int numL = value / 50;
// X(10)4
if (numL == 1) {
// L
int remainderL = value - (numL * 50);
if (remainderL / 10 == 4) {
romanSB.append("XC");
value -= 90;
} else {
romanSB.append("L");
value -= 50;
}
}
if (value == 0) {
return romanSB.toString();
}
// X(10)
int numX = value / 10;
if (numX == 4) {
romanSB.append("XL");
value -= 40;
} else {
for (int x = 0; x < numX; x++) {
romanSB.append("X");
value -= 10;
}
}
if (value == 0) {
return romanSB.toString();
}
// V(5)
int numV = value / 5;
// I(1)4
if (numV == 1) {
// L
int remainderV = value - (numV * 5);
if (remainderV / 1 == 4) {
romanSB.append("IX");
value -= 9;
} else {
romanSB.append("V");
value -= 5;
}
}
if (value == 0) {
return romanSB.toString();
}
// I(1)
int numI = value / 1;
// 4
if (numI == 4) {
romanSB.append("IV");
value -= 4;
} else {
for (int i = 0; i < numI; i++) {
romanSB.append("I");
value -= 1;
}
}
if (value != 0) {
throw new IllegalStateException("value is not zero:" + value);
}
return romanSB.toString();
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0