본문 바로가기

서적/리트코드

C# 리트코드 13. Roman to Integer

728x90
반응형

C# 으로 제출한 답안

public class Solution
{
  public int RomanToInt(string s)
  {
    int result = 0;
    string prev = string.Empty;
      
    for(int i = 0; i < s.Length; i++)
    {
      switch (s.Substring(i, 1))
      {
        case "I":
          result += 1;
          break;
        case "V":
          if (prev == "I") result += 3;
          else result += 5;
          break;
        case "X":
          if (prev == "I") result += 8;
          else result += 10;
          break;
        case "L":
          if (prev == "X") result += 30;
          else result += 50;
          break;
        case "C":
          if (prev == "X") result += 80;
          else result += 100;
          break;
        case "D":
          if (prev == "C") result += 300;
          else result += 500;
          break;
        case "M":
          if (prev == "C") result += 800;
          else result += 1000;
          break;
      }
      
      prev = s.Substring(i, 1);    
    }
    
    return result;
  }
}

Runtime: 106 ms Your runtime beats 35.35 % of csharp submissions.
Memory Usage: 35.7 MB Your memory usage beats 88.25 % of csharp submissions.

메모리 사용은 꽤 효율적이나 실행 시간이 많이 늦어 보인다.

 

검색 답안 - python

class Solution:
      def romanToInt(self, s):
      
        roman = { "I" : 1, "V" : 5, "X" : 10,
                  "L" : 50, "C" : 100, "D" : 500, "M" : 1000 }
        
        res = 0
        
        for i in range(len(s)):
          if i + 1 < len(s) and roman[s[i]] < roman[s[i + 1]]:
            res -= roman[s[i]]
          else:
            res += roman[s[i]]
          
        return res

Runtime: 44 ms Your runtime beats 58.30 % of csharp submissions.
Memory Usage: 13.5 MB Your memory usage beats 60.97 % of csharp submissions.

실행 시간이 반으로 줄었다. 그러나 여전히 파이썬 제출자 중에서는 엄청 빠른 편은 아니다.
메모리 사용은 3분의 1정도로 줄었다. 아무래도 파이썬 언어 특성인 것 같다.

 

검색 답안 python 을 C# 으로 수정

public class Solution
{
  public int RomanToInt(string s) 
  {
    Dictionary<string, int> roman = new Dictionary<string, int>();
    roman.Add("I", 1);
    roman.Add("V", 5);
    roman.Add("X", 10);
    roman.Add("L", 50);
    roman.Add("C", 100);
    roman.Add("D", 500);
    roman.Add("M", 1000);
    
    int res = 0;

    for(int i = 0; i < s.Length; i++)
    {
      if (i != s.Length - 1 && roman[s.Substring(i, 1)] < roman[s.Substring(i + 1, 1)])
        res -= roman[s.Substring(i, 1)];
      else
        res += roman[s.Substring(i, 1)];
    }
    
    return res;
  }
}

Runtime: 106 ms Your runtime beats 35.35 % of csharp submissions.
Memory Usage: 35.7 MB Your memory usage beats 88.25 % of csharp submissions.

Dictionary 를 사용하였다. 그러나 처음 제출한 코드와 동일한 실행시간과 메모리 사용을 보였다.

728x90
반응형

'서적 > 리트코드' 카테고리의 다른 글

C# 리트코드 20. Valid Parentheses  (0) 2022.01.19
C# 리트코드 14. Longest Common Prefix  (0) 2022.01.18
C# 리트코드 1. Two Sum  (0) 2022.01.13