https://leetcode.com/problems/roman-to-integer/
로마 표기로 숫자 주어질 때 정수로 변환한 값 반환하기
숫자 범위는 1~3999이다. (즉, MMMM~ 꼴은 input이 될 수 없다.)
1이 3개있는 형태로 1을 3번 더한 3이 된다.
각 로마 숫자에 해당되는 값들을 더하면 58이 된다.
현재 문자와 바로 뒤 문자를 보면서 해당 케이스가 subtraction case인지 확인한다. 해당되는 케이스에 대해 rule대로 case 나눠준 코드 (ex, I 뒤 V나 X면 -1 한 것을 정답에 더하기)
public class Solution {
public int RomanToInt(string s) {
Dictionary<char, int> romanToIntDict = new Dictionary<char, int>();
int sum = 0;
bool isSubtracted = false;
romanToIntDict.Add('I', 1);
romanToIntDict.Add('V', 5);
romanToIntDict.Add('X', 10);
romanToIntDict.Add('L', 50);
romanToIntDict.Add('C', 100);
romanToIntDict.Add('D', 500);
romanToIntDict.Add('M', 1000);
for (int i = 0; i < s.Length; i++)
{
if (!isSubtracted)
{
// I subtraction rule
if (s[i] == 'I' && i + 1 < s.Length && (s[i+1] == 'V' || s[i+1] == 'X'))
{
sum += (romanToIntDict[s[i+1]] - 1);
isSubtracted = true;
}
// X subtraction rule
else if (s[i] == 'X' && i + 1 < s.Length && (s[i+1] == 'L' || s[i+1] == 'C'))
{
sum += (romanToIntDict[s[i+1]] - 10);
isSubtracted = true;
}
// C subtraction rule
else if (s[i] == 'C' && i + 1 < s.Length && (s[i+1] == 'D' || s[i+1] == 'M'))
{
sum += (romanToIntDict[s[i+1]] - 100);
isSubtracted = true;
}
else
{
sum += romanToIntDict[s[i]];
}
}
else
{
isSubtracted = false;
}
}
return sum;
}
}