문제
제출한 코드
class Solution {
public int romanToInt(String s) {
// 1. s 쪼개기
// 2. 왼쪽에서 부터 큰 숫자다
// 3. 큰 숫자가 오긴 오는데, 예외를 조심한다
char[] romanChars = s.toCharArray();
int result = 0;
for (int i = 0; i < romanChars.length; i++) {
try {
char currentChar = romanChars[i];
if (!hasExceptionalCaseChar(currentChar)) {
result += getDefaultNumberForRoman(currentChar);
} else {
if (i == romanChars.length - 1) {
result += getDefaultNumberForRoman(currentChar);
} else {
String needToBeCheckedString = currentChar + String.valueOf(romanChars[i+1]);
if (!isExceptionalCaseString(needToBeCheckedString)) {
result += getDefaultNumberForRoman(currentChar);
} else {
result += getExceptionalNumberForRoman(needToBeCheckedString);
i++;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
private boolean hasExceptionalCaseChar(char character) {
return character == 'I' || character == 'X' || character == 'C';
}
private int getDefaultNumberForRoman(char character) throws Exception {
if (character == 'M') {
return 1000;
} else if (character == 'D') {
return 500;
} else if (character == 'C') {
return 100;
} else if (character == 'L') {
return 50;
} else if (character == 'X') {
return 10;
} else if (character == 'V') {
return 5;
} else if (character == 'I') {
return 1;
}
throw new Exception();
}
private boolean isExceptionalCaseString(String chars) {
return chars.equals("IV")
|| chars.equals("IX")
|| chars.equals("XL")
|| chars.equals("XC")
|| chars.equals("CD")
|| chars.equals("CM");
}
private int getExceptionalNumberForRoman(String chars) throws Exception {
if (chars.equals("IV")) {
return 4;
} else if (chars.equals("IX")) {
return 9;
} else if (chars.equals("XL")) {
return 40;
} else if (chars.equals("XC")) {
return 90;
} else if (chars.equals("CD")) {
return 400;
} else if (chars.equals("CM")) {
return 900;
}
throw new Exception();
}
}
잘한점
개선 할 점
- StringBuilder / StringBuffer를 사용 했으면 좀 더 좋았을 것 같음