結果
問題 | No.518 ローマ数字の和 |
ユーザー |
![]() |
提出日時 | 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 |
ソースコード
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;// Cが4つになるか判定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;// Cが4つ重なる場合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();}}