<Easy> Roman to Integer (LeetCode : C#)

이도희·2023년 2월 22일
0

알고리즘 문제 풀이

목록 보기
10/185

https://leetcode.com/problems/roman-to-integer/

📕 문제 설명

로마 표기로 숫자 주어질 때 정수로 변환한 값 반환하기

숫자 범위는 1~3999이다. (즉, MMMM~ 꼴은 input이 될 수 없다.)

로마 표기법 특징

  • 4는 IIII로 표기하지 않고, IV로 표기한다. (5 바로 전 숫자라 5 - 1의 형태라고 이해하면 된다.)
  • 비슷한 방식으로 9는 (10 - 1) 이므로, IX로 표기한다.
  • 이러한 뺄셈 방식은 다음의 예시처럼 적용된다.
    1) I는 V (5), X (10) 전에 배치되어 4와 9를 만든다.
    2) X는 L (50), C (100) 전에 배치되어 40과 90을 만든다.
    3) C는 D (500), M (1000) 전에 배치되어 400과 900을 만든다.
  • Input
    로마 표기로 된 숫자
  • Output
    변환된 정수

예제

  1. 1이 3개있는 형태로 1을 3번 더한 3이 된다.

  2. 각 로마 숫자에 해당되는 값들을 더하면 58이 된다.

  1. 앞의 로마 표기법을 대입해보면 된다. C가 M 앞에 놓여서 900을 만들고, X가 C앞에 놓여 90을, I가 V앞에 놓여서 4를 만든 케이스다.

풀이

현재 문자와 바로 뒤 문자를 보면서 해당 케이스가 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;    
    }
}

결과

profile
하나씩 심어 나가는 개발 농장🥕 (블로그 이전중)

0개의 댓글