WN_인생기록

LeetCode - 13 Roman to Integer 본문

LeetCode/Easy

LeetCode - 13 Roman to Integer

WhNi 2024. 3. 27. 15:14

로마숫자를 int로 표현하는 문제이다.

 

단순하게 매핑된 값을 꺼내는 문제인줄 알았으나,

 

조건이 있는게, IIII의 경우 IV 같이 5-4 라고 표현하는 것이다.

 

이는, 왼쪽에서 오른쪽으로 파싱할때, 현재의 숫자가 뒷자리 보다 작으면 -를

현재의 숫자가 뒷자리 보다 크면 + 를 한다는걸 의미한다.

(이게 제일 헷갈렸음)

 

그래서 이 조건을 따라보면,

class Solution 
{
public:
    int romanToInt(string s)
    {
        unordered_map<char, int> a;

        a.emplace('I', 1);
        a.emplace('V', 5);
        a.emplace('X', 10);
        a.emplace('L', 50);
        a.emplace('C', 100);
        a.emplace('D', 500);
        a.emplace('M', 1000);        

        int result = 0;
            // 문자열을 순회 처음부터 마지막까지
        for (int i = 0; i < s.length(); i++)
        { 
            // 현재 문자가 마지막일때 혹은 현재의 문자값이 다음 문자의 값보다 크거나 같을때
            if (i == s.length() - 1 || a[s[i]] >= a[s[i + 1]])
            {
                result += a[s[i]];
            }
            else
            {
                result -= a[s[i]];
            }

        }
        return result;
    }
};

이런식으로 된다. 중요한건, s.length() -1 을 마지막으로 두어야 하는것인데, 안그러면 배열에서 넘어가는 값이 나와서 오류가 난다. 이를 방지하는 s.length()-1을 꼭 해줘야 한다.

 

그래서 이 조건대로 판별하면 원하는 값이 나온다.

 

성공했으나, 가장 효율적이었던 것은 map을 이용한 해시값 대응보다, 역순으로 for문 돌면서 switch로 값을 판별하는 것이 가장 빠른 방법이었다. 

'LeetCode > Easy' 카테고리의 다른 글

LeetCode - 14.Longest Common Prefix  (0) 2024.03.27
LeetCode - 9. Palindrome Number  (0) 2024.03.27