Roman to Integer Conversion (original) (raw)

Last Updated : 15 Jul, 2025

Given a string s representing a Roman numeral, find it's corresponding integer value.
Roman numerals are formed using the following symbols: I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, and M = 1000.
Numbers are typically formed by combining these symbols from left to right, adding or subtracting their values based on specific rules.

**How does the conversion work?

**Examples:

**Input: s = "IX"
**Output: 9
**Explanation: IX is a Roman symbol which represents 10 - 1 = 9

**Input: s = "XL"
**Output: 40
**Explanation: XL is a Roman symbol which represents 50 - 10 = 40

**Input: s = "MCMIV"
**Output: 1904
**Explanation: M is 1000, CM is 1000 - 100 = 900, and IV is 4. So we have total as 1000 + 900 + 4 = 1904

Try It Yourselfredirect icon

Table of Content

[Expected Approach 1] Using Iterative Comparison - O(n) time and O(1) space

The idea for converting a Roman numeral to an integer is that, we have to traverse the string from left to right. For each symbol compare it with the next symbol (if it exists). If the current symbol is greater than or equal to the next symbol then add its value to the result. Otherwise, subtract its value from the next symbol's value and add the result to the total, and skip the next symbol.

C++ `

#include using namespace std;

// this function returns value of a Roman symbol int value(char r) { if (r == 'I') return 1; if (r == 'V') return 5; if (r == 'X') return 10; if (r == 'L') return 50; if (r == 'C') return 100; if (r == 'D') return 500; if (r == 'M') return 1000; return -1; }

// returns decimal value of roman numeral int romanToDecimal(string& s) { int res = 0;

for (int i = 0; i < s.length(); i++) {
    
    // get value of current symbol
    int s1 = value(s[i]);

    // Compare with the next symbol if it exists
    if (i + 1 < s.length()) {
        int s2 = value(s[i + 1]);

        // if current value is greater or equal, 
        // add it to result
        if (s1 >= s2) {
            res += s1;
        }
        else {
            // else, add the difference and skip 
            // next symbol
            res += (s2 - s1);
            i++;
        }
    }
    else {
        res += s1;
    }
}

return res;

}

int main() { string s = "IX"; cout << romanToDecimal(s) << endl; return 0; }

Java

class GfG { // this function returns value of a Roman symbol static int value(char r) { if (r == 'I') return 1; if (r == 'V') return 5; if (r == 'X') return 10; if (r == 'L') return 50; if (r == 'C') return 100; if (r == 'D') return 500; if (r == 'M') return 1000; return -1; }

// returns decimal value of roman numeral
static int romanToDecimal(String s) {
    int res = 0; 

    for (int i = 0; i < s.length(); i++) {
        
        //get value of current symbol
        int s1 = value(s.charAt(i));

        // compare with the next symbol if it exists
        if (i + 1 < s.length()) {
            int s2 = value(s.charAt(i + 1));

            // If current value is greater or equal, 
            // add it to result
            if (s1 >= s2) {
                res += s1;
            }
            else {
                // else, add the difference and skip 
                // next symbol
                res += (s2 - s1);
                i++;
            }
        }
        else {
            res += s1;
        }
    }

    return res;
}

public static void main(String[] args) {
    String s = "IX";
    System.out.println(romanToDecimal(s));
}

}

Python

this function returns value of a Roman symbol

def value(r): if r == 'I': return 1 if r == 'V': return 5 if r == 'X': return 10 if r == 'L': return 50 if r == 'C': return 100 if r == 'D': return 500 if r == 'M': return 1000 return -1

returns decimal value of roman numeral

def romanToDecimal(s): res = 0 i = 0 while i < len(s):

    # get value of current symbol
    s1 = value(s[i])

    # compare with the next symbol if it exists
    if i + 1 < len(s):
        s2 = value(s[i + 1])

        # if current value is greater or equal, 
        # add it to result
        if s1 >= s2:
            res += s1
        else:
            # else, add the difference and 
            # skip next symbol
            res += (s2 - s1)
            i += 1
    else:
        res += s1
    i += 1

return res

if name == "main": s = "IX" print(romanToDecimal(s))

C#

using System;

class GfG {

// this function returns value of a Roman symbol
static int value(char r) {
    if (r == 'I')
        return 1;
    if (r == 'V')
        return 5;
    if (r == 'X')
        return 10;
    if (r == 'L')
        return 50;
    if (r == 'C')
        return 100;
    if (r == 'D')
        return 500;
    if (r == 'M')
        return 1000;
    return -1;
}

// returns decimal value of roman numeral
static int romanToDecimal(string s) {
    int res = 0; 

    for (int i = 0; i < s.Length; i++) {
      
        // get value of current symbol
        int s1 = value(s[i]);

        // compare with the next symbol if it exists
        if (i + 1 < s.Length) {
            int s2 = value(s[i + 1]);

            // if current value is greater or equal, 
            // add it to result
            if (s1 >= s2) {
                res += s1;
            }
            else {
                // else, add the difference and skip
                // next symbol
                res += (s2 - s1);
                i++;
            }
        }
        else {
            res += s1;
        }
    }

    return res;
}

static void Main() {
    string s = "IX";
    Console.WriteLine(romanToDecimal(s));
}

}

JavaScript

// this function returns value of a Roman symbol function value(r) { if (r === 'I') return 1; if (r === 'V') return 5; if (r === 'X') return 10; if (r === 'L') return 50; if (r === 'C') return 100; if (r === 'D') return 500; if (r === 'M') return 1000; return -1; }

// returns decimal value of roman numeral function romanToDecimal(s) { let res = 0;

for (let i = 0; i < s.length; i++) {
    
    // get value of current symbol
    let s1 = value(s[i]);

    // compare with the next symbol if it exists
    if (i + 1 < s.length) {
        let s2 = value(s[i + 1]);

        // if current value is greater or equal, 
        // add it to result
        if (s1 >= s2) {
            res += s1;
        }
        else {
            // else, add the difference and 
            // skip next symbol
            res += (s2 - s1);
            i++;
        }
    }
    else {
        res += s1;
    }
}

return res;

}

// Driver Code let s = "IX"; console.log(romanToDecimal(s));

`

[Expected Approach 2] Using Hashing - O(n) time and O(1) space

We can use an hash map or dictionary to store the values of Roman symbols. And to solve the problem, we have to iterate through the string and for each symbol, check if the current value is less than the next value. If so, subtract the current value from the next value and add the result to the total. Otherwise, add the current value to the total.

C++ `

#include #include using namespace std;

int romanToDecimal(string &s) { unordered_map<char, int> romanMap = {{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}};

int res = 0;
for (int i = 0; i < s.length(); i++) {

    // if the current value is less than the next value, 
    // subtract current from next and add to res
    if (i + 1 < s.length() && romanMap[s[i]] < romanMap[s[i + 1]]) {
        res += romanMap[s[i + 1]] - romanMap[s[i]];

        // skip the next symbol
        i++;
    }
    else {

        // otherwise, add the current value to res
        res += romanMap[s[i]];
    }
}

return res;

}

int main() {

string s = "IX";
cout << romanToDecimal(s) << endl;
return 0;

}

Java

import java.util.HashMap;

class GfG {

static int romanToDecimal(String s) {
    HashMap<Character, Integer> romanMap = new HashMap<>();
    romanMap.put('I', 1);
    romanMap.put('V', 5);
    romanMap.put('X', 10);
    romanMap.put('L', 50);
    romanMap.put('C', 100);
    romanMap.put('D', 500);
    romanMap.put('M', 1000);

    int res = 0;
    for (int i = 0; i < s.length(); i++) {

        // if the current value is less than the next value,
        // subtract current from next and add to res
        if (i + 1 < s.length() && romanMap.get(s.charAt(i)) < 
                                romanMap.get(s.charAt(i + 1))) {
            res += romanMap.get(s.charAt(i + 1)) - 
                                  romanMap.get(s.charAt(i));

            // skip the next symbol
            i++;
        }
        else {

            // otherwise, add the current value to res
            res += romanMap.get(s.charAt(i));
        }
    }

    return res;
}

public static void main(String[] args) {
    String s = "IX";
    System.out.println(romanToDecimal(s));
}

}

Python

def romanToDecimal(s): romanMap = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}

res = 0
i = 0
while i < len(s):

    # if the current value is less than the next value, 
    # subtract current from next and add to res
    if i + 1 < len(s) and romanMap[s[i]] < romanMap[s[i + 1]]:
        res += romanMap[s[i + 1]] - romanMap[s[i]]

        # skip the next symbol
        i += 1
    else:

        # otherwise, add the current value to res
        res += romanMap[s[i]]
    i += 1

return res

if name == "main": s = "IX" print(romanToDecimal(s))

C#

using System; using System.Collections.Generic;

class GfG { static int romanToDecimal(string s) {

    // create a map to store the Roman numeral values
    Dictionary<char, int> romanMap = 
        new Dictionary<char, int> {
            {'I', 1}, {'V', 5}, {'X', 10}, {'L', 50},
            {'C', 100}, {'D', 500}, {'M', 1000}
        };

    int res = 0;
    for (int i = 0; i < s.Length; i++) {
      
        // if the current value is less than the next value, 
        // subtract current from next and add to res
        if (i + 1 < s.Length && romanMap[s[i]] < romanMap[s[i + 1]]) {
            res += romanMap[s[i + 1]] - romanMap[s[i]];

            // skip the next symbol
            i++;
        }
        else {
            
            // otherwise, add the current value to res
            res += romanMap[s[i]];
        }
    }

    return res;
}

static void Main() {
    string s = "IX";
    Console.WriteLine(romanToDecimal(s));
}

}

JavaScript

function romanToDecimal(s) {

// create a map to store the Roman numeral values
const romanMap = {
    'I': 1, 'V': 5, 'X': 10, 'L': 50,
    'C': 100, 'D': 500, 'M': 1000
};

let res = 0;
for (let i = 0; i < s.length; i++) {

    // if the current value is less than the next value, 
    // subtract current from next and add to res
    if (i + 1 < s.length && romanMap[s[i]] < romanMap[s[i + 1]]) {
        res += romanMap[s[i + 1]] - romanMap[s[i]];

        // skip the next symbol
        i++;
    }
    else {

        // otherwise, add the current value to res
        res += romanMap[s[i]];
    }
}

return res;

}

// Driver Code let s = "IX"; console.log(romanToDecimal(s));

`