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

이도희·2023년 3월 2일
0

알고리즘 문제 풀이

목록 보기
25/185

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

📕 문제 설명

정수가 주어질 때 로마 표기로 변환해서 반환하기

숫자 범위는 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
    로마 표기로 변환된 숫자

예제

풀이

각 자릿수 string으로 처리해서 4랑 9, 그 외로 나눠서 처리

public class Solution {
    public string IntToRoman(int num) {

        string answer = "";
        string[] subtractionDigit = new string[3] {"I", "X", "C"};
        string[] subtractionFive = new string[3] {"V", "L", "D"};
        string[] subtractionTen = new string[3] {"X", "C", "M"};

        Dictionary<int, string> intToRomanDict = new Dictionary<int, string>();

        intToRomanDict.Add(1, "I");
        intToRomanDict.Add(5, "V");
        intToRomanDict.Add(10, "X");
        intToRomanDict.Add(50, "L");
        intToRomanDict.Add(100, "C");
        intToRomanDict.Add(500, "D");
        intToRomanDict.Add(1000, "M");
        
        string number = num.ToString();
		// M 먼저 처리 (1000의 자릿수)
        if (number.Length == 4)
        {
            for (int i = 0; i < int.Parse(number[0].ToString()); i++)
            {
                answer += "M";
            }

            number = number.Substring(1, number.Length - 1);
        }
		
        // 100, 10, 1 단위 처리
        for (int i = 0; i < number.Length; i++)
        {
        	// 현재 자릿 수에 해당 되는 숫자
            int currentDigit = int.Parse(number[i].ToString());
            // 자릿수 정보
            int digit = number.Length - i - 1;
            switch (currentDigit)
            {
                case 4:
                    answer += subtractionDigit[digit];
                    answer += subtractionFive[digit];
                    break;
                case 9:
                    answer += subtractionDigit[digit];
                    answer += subtractionTen[digit];
                    break;
                default:
                    if (currentDigit >= 5)
                    {
                        answer += intToRomanDict[5 * (int)Math.Pow(10, digit)];
                        currentDigit -= 5;
                    }
                    if (currentDigit != 0)
                    {
                        for (int j = 0; j < currentDigit; j++)
                        {
                            answer += intToRomanDict[1 * (int)Math.Pow(10, digit)];
                        }
                    }

                    break;
            }
        }

        return answer;
    }
}

결과

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

0개의 댓글