Programming/LeetCode

[Dart] 12. Integer to Roman

Meezzi 2025. 5. 13. 10:00
728x90

1. 문제

https://leetcode.com/problems/integer-to-roman/description/?envType=study-plan-v2&envId=top-interview-150

 

 

2. 요구사항

1) 로마 숫자를 나타내는 7개의 서로 다른 기호와 그 값이 있다.

2) 로마 숫자는 가장 높은 자리 값부터 낮은 자리값까지 순서대로 변환한 결과를 연결하여 형성된다.

3) 자리 값을 로마 숫자로 변환하기 위해 다음 규칙을 따른다.

  • 값이 4 또는 9로 시작하지 않을 경우:
    • 입력값에서 뺄 수 있는 최대값을 나타내는 기호를 선택한다.
    • 그 기호를 결과에 추가한다.
    • 해당 값만큼 입력값에서 뺀 나머지를 다시 로마 숫자로 변환한다.
  • 값이 4 또는 9로 시작할 경우:
    •  빼기 형식(subtractive form)을 사용하여 다음 기호에서 하나를 뺀 값을 나타낸다.
    • 예를 들어, 4는 5(V)보다 1(I) 적으므로 `IV`, 9는 10(X)보다 1(I) 적으므로 `IX`이다.
    • 사용되는 빼기 형식은 다음과 같다.
      • 4 (IV), 9 (IX), 40 (XL), 90 (XC), 400 (CD), 900 (CM)
  • 같은 기호를 연속해서 나타낼 수 있는 최대 횟수는 3회:
    • 10의 거듭제곱(I, X, C, M)만 연속해서 최대 3번까지 사용할 수 있다.
    • 5(V), 50(L), 500(D)은 연속해서 사용할 수 없다.
    • 만약 4번 이상 사용해야 할 경우 빼기 형식을 사용한다.

 

 

 

3. 코드

class Solution {
  String intToRoman(int num) {
    // 로마 숫자 기호와 그에 해당하는 값을 리스트로 정의
    List<String> symbols = [
      "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"
    ];

    List<int> values = [
      1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1
    ];

    String result = '';

    for (int i = 0; i < symbols.length; i++) {
      // 현재 값이 num보다 작거나 같을 때까지 반복
      while (num >= values[i]) {
        // 해당 기호를 결과에 추가
        result += symbols[i];
        // 숫자에서 해당 값을 뺌
        num -= values[i];
      }
    }

    return result;
  }
}

 

 

728x90