content: package by.andd3dfx.numeric;
  
  import java.util.LinkedHashMap;
  
  /**
   * <pre>
   * <a href="https://leetcode.com/problems/integer-to-roman/description/">Task description</a>
   *
   * Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
   * Symbol       Value
   * I             1
   * V             5
   * X             10
   * L             50
   * C             100
   * D             500
   * M             1000
   *
   * For example, 2 is written as II in Roman numeral, just two one's added together. 12 is written as XII,
   * which is simply X + II. The number 27 is written as XXVII, which is XX + V + II.
   *
   * Roman numerals are usually written largest to smallest from left to right. However,
   * the numeral for four is not IIII. Instead, the number four is written as IV.
   * Because the one is before the five we subtract it making four. The same principle applies to the number nine,
   * which is written as IX. There are six instances where subtraction is used:
   *     I can be placed before V (5) and X (10) to make 4 and 9.
   *     X can be placed before L (50) and C (100) to make 40 and 90.
   *     C can be placed before D (500) and M (1000) to make 400 and 900.
   *
   * Given an integer, convert it to a roman numeral.
   *
   * Example 1:
   * Input: num = 3
   * Output: "III"
   * Explanation: 3 is represented as 3 ones.
   *
   * Example 2:
   * Input: num = 58
   * Output: "LVIII"
   * Explanation: L = 50, V = 5, III = 3.
   *
   * Example 3:
   * Input: num = 1994
   * Output: "MCMXCIV"
   * Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
   *
   * Constraints:
   *     1 <= num <= 3999
   * </pre>
   *
   * @see <a href="https://youtu.be/83hLrZyfxeU">Video solution</a>
   */
  public class IntegerToRoman {
  
      private static final LinkedHashMap<Integer, String> vocabulary = new LinkedHashMap<>() {{
          put(1000, "M");
          put(900, "CM");
          put(500, "D");
          put(400, "CD");
          put(100, "C");
          put(90, "XC");
          put(50, "L");
          put(40, "XL");
          put(10, "X");
          put(9, "IX");
          put(5, "V");
          put(4, "IV");
          put(1, "I");
      }};
  
      public static String intToRoman(int number) {
          if (number < 1 || number > 3999) {
              throw new IllegalArgumentException("Parameter `number` should belong interval: [1, 3999]");
          }
  
          var sb = new StringBuilder();
          for (var entry : vocabulary.entrySet()) {
              var key = entry.getKey();
              var value = entry.getValue();
  
              while (number >= key) {
                  sb.append(value);
                  number -= key;
              }
          }
          return sb.toString();
      }
  }
  