입력받은 로마 숫자를 정수형 값으로 변환하여 반환해라.
입력 값의 타입은 문자열이고 출력 타입은 integer형이다.
입력받는 로마 숫자의 제한은 (3999)까지 이다.
이 문제는 로마 숫자의 구성만 알면 쉽게 풀 수 있다. 각각의 알파벳은 고유의 숫자 값을 가지고 있고 주의해야할 점은 8은 VIII로 표현되지만 9는 IV로 표현 된다는 점이다. 예를 하나 더들면 40은 XL이다.
이 점을 활용하여 우선 모든 문자의 값을 별도의 배열에 저장한다.
예를 들어 DCXXI 를 숫자로 바꿔보자.
D는 500, C는 100, X는 10, I는 1이다. 각 글자별로 배열에 저장하면 다음과 같다.
문자 | D |
C |
X |
X |
I |
값 | 500 |
100 |
10 |
10 |
1 |
인덱스 | 0 |
1 |
2 |
3 |
4 |
그리고 오른쪽 즉 마지막부터 읽어들이면서 모든 값을 더해 주면 된다.
이 때 이전 값보다 작은 값이 나오는 경우, 예를 들어 XL과 같이 50다음에 10이 나오는 경우는 값을 더하는 것 대신 빼주면 우리가 구하려는 값을 얻을 수 있게 된다.
Java code:
class Solution {
public int romanToInt(String s) {
int[] nums = new int[s.length()];
char[] temp = s.toCharArray();
for(int i = 0; i < temp.length; i++) {
switch(temp[i]) {
case 'M':
nums[i] = 1000;
break;
case 'D':
nums[i] = 500;
break;
case 'C':
nums[i] = 100;
break;
case 'L':
nums[i] = 50;
break;
case 'X':
nums[i] = 10;
break;
case 'V':
nums[i] = 5;
break;
case 'I':
nums[i] = 1;
break;
}
}
int result = 0;
int prev = 0;
for(int i = nums.length-1; i >= 0; i--) {
if(nums[i] < prev) {
result -= nums[i];
}
else {
result += nums[i];
prev = nums[i];
}
}
return result;
}
}