## DEV Community # Solution: Integer to Roman

This is part of a series of Leetcode solution explanations (index). If you liked this solution or found it useful, please like this post and/or upvote my solution post on Leetcode's forums.

#### Description:

(Jump to: Solution Idea || Code: JavaScript | Python | Java | C++)

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.

#### Examples:

Example 1:
Input: num = 3
Output: "III"
Example 2:
Input: num = 4
Output: "IV"
Example 3:
Input: num = 9
Output: "IX"
Example 4:
Input: num = 58
Output: "LVIII"
Explanation: L = 50, V = 5, III = 3.
Example 5:
Input: num = 1994
Output: "MCMXCIV"
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

#### Constraints:

• `1 <= num <= 3999`

#### Idea:

(Jump to: Problem Description || Code: JavaScript | Python | Java | C++)

Just like Roman to Integer, this problem is most easily solved using a lookup table for the conversion between digit and numeral. In this case, we can easily deal with the values in descending order and insert the appropriate numeral (or numerals) as many times as we can while reducing the our target number (N) by the same amount.

Once N runs out, we can return ans.

#### Implementation:

Java's StringBuilder can take care of repeated string concatenations without some of the overhead of making string copies.

#### Javascript Code:

``````const val = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
const rom = ["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]

var intToRoman = function(N) {
let ans = ""
for (let i = 0; N; i++)
while (N >= val[i]) ans += rom[i], N -= val[i]
return ans
};
``````

#### Python Code:

``````val = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
rom = ["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]

class Solution:
def intToRoman(self, N: int) -> str:
ans = ""
for i in range(13):
while N >= val[i]:
ans += rom[i]
N -= val[i]
return ans
``````

#### Java Code:

``````class Solution {
final static int[] val = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
final static String[] rom = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};

public String intToRoman(int N) {
StringBuilder ans = new StringBuilder();
for (int i = 0; N > 0; i++)
while (N >= val[i]) {
ans.append(rom[i]);
N -= val[i];
}
return ans.toString();
}
}
``````

#### C++ Code:

``````class Solution {
public:
const int val = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
const string rom = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};

string intToRoman(int N) {
string ans = "";
for (int i = 0; N; i++)
while (N >= val[i]) ans += rom[i], N -= val[i];
return ans;
}
};
``````