結果

問題 No.518 ローマ数字の和
ユーザー hiromi_ayase
提出日時 2017-05-30 15:10:48
言語 Java
(openjdk 23)
結果
AC  
実行時間 52 ms / 2,000 ms
コード長 5,342 bytes
コンパイル時間 2,365 ms
コンパイル使用メモリ 77,860 KB
実行使用メモリ 50,040 KB
最終ジャッジ日時 2024-09-21 19:19:11
合計ジャッジ時間 3,928 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 19
権限があれば一括ダウンロードができます

ソースコード

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

import java.io.IOException;
import java.io.InputStream;
import java.util.NoSuchElementException;
public class Main {
public static void main(String[] args) {
FastScanner sc = new FastScanner();
int N = sc.nextInt();
int total = 0;
for (int i = 0; i < N; i++) {
total += r2i(sc.next());
}
if (total <= 3999) {
System.out.println(i2r(total));
} else {
System.out.println("ERROR");
}
}
private static String i2r(int n) {
StringBuilder sb = new StringBuilder();
while (n >= 1000) {
sb.append("M");
n -= 1000;
}
if (n >= 900) {
sb.append("CM");
n -= 900;
}
if (n >= 500) {
sb.append("D");
n -= 500;
}
if (n >= 400) {
sb.append("CD");
n -= 400;
}
while (n >= 100) {
sb.append("C");
n -= 100;
}
if (n >= 90) {
sb.append("XC");
n -= 90;
}
if (n >= 50) {
sb.append("L");
n -= 50;
}
if (n >= 40) {
sb.append("XL");
n -= 40;
}
while (n >= 10) {
sb.append("X");
n -= 10;
}
if (n >= 9) {
sb.append("IX");
n -= 9;
}
if (n >= 5) {
sb.append("V");
n -= 5;
}
if (n >= 4) {
sb.append("IV");
n -= 4;
}
while (n >= 1) {
sb.append("I");
n -= 1;
}
return sb.toString();
}
private static int r2i(String s) {
int ret = 0;
for (int i = 0; i < s.length(); i++) {
int c1 = s.charAt(i);
boolean flg = false;
if (i < s.length() - 1) {
int c2 = s.charAt(i + 1);
if (c1 == 'I') {
if (c2 == 'X') {
ret += 9;
flg = true;
} else if (c2 == 'V') {
ret += 4;
flg = true;
}
} else if (c1 == 'X') {
if (c2 == 'L') {
ret += 40;
flg = true;
} else if (c2 == 'C') {
ret += 90;
flg = true;
}
} else if (c1 == 'C') {
if (c2 == 'D') {
ret += 400;
flg = true;
} else if (c2 == 'M') {
ret += 900;
flg = true;
}
}
}
if (flg) {
i++;
} else if (c1 == 'I') {
ret += 1;
} else if (c1 == 'V') {
ret += 5;
} else if (c1 == 'X') {
ret += 10;
} else if (c1 == 'L') {
ret += 50;
} else if (c1 == 'C') {
ret += 100;
} else if (c1 == 'D') {
ret += 500;
} else if (c1 == 'M') {
ret += 1000;
}
}
return ret;
}
}
class FastScanner {
public static String debug = null;
private final InputStream in = System.in;
private int ptr = 0;
private int buflen = 0;
private byte[] buffer = new byte[1024];
private boolean eos = false;
private boolean hasNextByte() {
if (ptr < buflen) {
return true;
} else {
ptr = 0;
try {
if (debug != null) {
buflen = debug.length();
buffer = debug.getBytes();
debug = "";
eos = true;
} else {
buflen = in.read(buffer);
}
} catch (IOException e) {
e.printStackTrace();
}
if (buflen < 0) {
eos = true;
return false;
} else if (buflen == 0) {
return false;
}
}
return true;
}
private int readByte() {
if (hasNextByte())
return buffer[ptr++];
else
return -1;
}
private static boolean isPrintableChar(int c) {
return 33 <= c && c <= 126;
}
private void skipUnprintable() {
while (hasNextByte() && !isPrintableChar(buffer[ptr]))
ptr++;
}
public boolean isEOS() {
return this.eos;
}
public boolean hasNext() {
skipUnprintable();
return hasNextByte();
}
public String next() {
if (!hasNext())
throw new NoSuchElementException();
StringBuilder sb = new StringBuilder();
int b = readByte();
while (isPrintableChar(b)) {
sb.appendCodePoint(b);
b = readByte();
}
return sb.toString();
}
public long nextLong() {
if (!hasNext())
throw new NoSuchElementException();
long n = 0;
boolean minus = false;
int b = readByte();
if (b == '-') {
minus = true;
b = readByte();
}
if (b < '0' || '9' < b) {
throw new NumberFormatException();
}
while (true) {
if ('0' <= b && b <= '9') {
n *= 10;
n += b - '0';
} else if (b == -1 || !isPrintableChar(b)) {
return minus ? -n : n;
} else {
throw new NumberFormatException();
}
b = readByte();
}
}
public int nextInt() {
return (int) nextLong();
}
public long[] nextLongList(int n) {
return nextLongTable(1, n)[0];
}
public int[] nextIntList(int n) {
return nextIntTable(1, n)[0];
}
public long[][] nextLongTable(int n, int m) {
long[][] ret = new long[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ret[i][j] = nextLong();
}
}
return ret;
}
public int[][] nextIntTable(int n, int m) {
int[][] ret = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ret[i][j] = nextInt();
}
}
return ret;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0