Sort an array of Roman Numerals in ascending order

16 Nov, 2021
Given an array arr[] of N Roman Numerals, the task is to sort these Roman Numerals in ascending order.
Examples: 
Input: arr[] = { “MCMIV”, “MIV”, “MCM”, “MMIV” } Output: MIV MCM MCMIV MMIV Explanation: The roman numerals in their corresponding decimal system are: MIV: 1004 MCM: 1900 MCMIV: 1904 MMIV: 2004
Input: arr = { “MV”, “MIV”, “MCM”, “MM” } Output: MIV MV MCM MM Explanation: The roman numerals in their corresponding decimal system are: MIV 1004 MV 1005 MCM 1900 MM 2000 
Approach: The idea to solve this problem is to store each element with its Roman to Integer value in a vector pair and then sort all the elements of the vector according to Roman to Integer value stored. 
Iterate the given roman number.
Convert the roman number to the decimal and store them as a pair in a vector.
Sort the vector based on the decimal numbers stored in them.
Finally, print the roman numbers in sorted order.
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ program to sort an array of// Roman Numerals in ascending order #include <bits/stdc++.h>using namespace std; // Function to return the value// of a Roman symbolint value(char r){    // I in roman is equal to    // 1 in decimal    if (r == 'I')        return 1;     // V in roman is equal to    // 5 in decimal    if (r == 'V')        return 5;     // X in roman is equal to    // 10 in decimal    if (r == 'X')        return 10;     // L in roman is equal to    // 50 in decimal    if (r == 'L')        return 50;     // C in roman is equal to    // 100 in decimal    if (r == 'C')        return 100;     // D in roman is equal to    // 500 in decimal    if (r == 'D')        return 500;     // M in roman is equal to    // 1000 in decimal    if (r == 'M')        return 1000;     return -1;} // Function to return the decimal value// of a roman numaralint romanToDecimal(string& str){    // Initialize result    int res = 0;     // Traverse given input    for (int i = 0; i < str.length(); i++) {         // Getting value of symbol s[i]        int s1 = value(str[i]);         if (i + 1 < str.length()) {             // Getting value of symbol s[i+1]            int s2 = value(str[i + 1]);             // Comparing both values            if (s1 >= s2) {                 // Value of current symbol                // is >= the next symbol                res = res + s1;            }            else {                 // Value of current symbol                // is < the next symbol                res = res + s2 - s1;                i++;            }        }        else {            res = res + s1;        }    }    return res;} // Function to sort the array according to// the increasing ordervoid sortArr(string arr[], int n){    // Vector to store the roman to integer    // with respective elements    vector<pair<int, string> > vp;     // Inserting roman to integer    // with respective elements in vector pair    for (int i = 0; i < n; i++) {        vp.push_back(make_pair(            romanToDecimal(                arr[i]),            arr[i]));    }     // Sort the vector, this will sort the pair    // according to the increasing order.    sort(vp.begin(), vp.end());     // Print the sorted vector content    for (int i = 0; i < vp.size(); i++)        cout << vp[i].second << " "             << vp[i].first << "\n";} // Driver codeint main(){    string arr[] = { "MCMIV", "MIV",                     "MCM", "MMIV" };    int n = sizeof(arr) / sizeof(arr[0]);     sortArr(arr, n);     return 0;}
// Java program to sort an array of// Roman Numerals in ascending orderimport java.io.*;import java.util.*; // User defined Pair classclass Pair{    int x;    String y;         public Pair(int a, String b)    {        this.x = a;        this.y = b;    }} // Class to define user defined conparatorclass Compare{    static void compare(ArrayList<Pair> vp)    {                 // Comparator to sort the pair according        // to first element        Collections.sort(vp, new Comparator<Pair>()        {            @Override public int compare(Pair p1, Pair p2)            {                return p1.x - p2.x;            }        });    }} class GFG{ // Function to return the value// of a Roman symbolstatic int value(char r){         // I in roman is equal to    // 1 in decimal    if (r == 'I')        return 1;     // V in roman is equal to    // 5 in decimal    if (r == 'V')        return 5;     // X in roman is equal to    // 10 in decimal    if (r == 'X')        return 10;     // L in roman is equal to    // 50 in decimal    if (r == 'L')        return 50;     // C in roman is equal to    // 100 in decimal    if (r == 'C')        return 100;     // D in roman is equal to    // 500 in decimal    if (r == 'D')        return 500;     // M in roman is equal to    // 1000 in decimal    if (r == 'M')        return 1000;     return -1;} // Function to return the decimal value// of a roman numaralstatic int romanToDecimal(String str){         // Initialize result    int res = 0;     // Traverse given input    for(int i = 0; i < str.length(); i++)    {                 // Getting value of symbol s[i]        int s1 = value(str.charAt(i));         if (i + 1 < str.length())        {                         // Getting value of symbol s[i+1]            int s2 = value(str.charAt(i + 1));             // Comparing both values            if (s1 >= s2)            {                                 // Value of current symbol                // is >= the next symbol                res = res + s1;            }            else            {                                 // Value of current symbol                // is < the next symbol                res = res + s2 - s1;                i++;            }        }        else        {            res = res + s1;        }    }    return res;} // Function to sort the array according to// the increasing orderstatic void sortArr(String[] arr, int n){         // Vector to store the roman to integer    // with respective elements    ArrayList<Pair> vp = new ArrayList<Pair>();     // Inserting roman to integer    // with respective elements in vector pair    for(int i = 0; i < n; i++)    {        vp.add(new Pair(romanToDecimal(arr[i]),                                       arr[i]));    }     // Sort the vector, this will sort the pair    // according to the increasing order.    Compare obj = new Compare();    obj.compare(vp);     // Print the sorted vector content    for(int i = 0; i < vp.size(); i++)        System.out.println(vp.get(i).y + " " +                           vp.get(i).x + "\n");} // Driver Codepublic static void main(String[] args){    String arr[] = { "MCMIV", "MIV", "MCM", "MMIV" };    int n = arr.length;     sortArr(arr, n);}} // This code is contributed by akhilsaini
# Python3 program to sort an array of# Roman Numerals in ascending order # Function to return the value# of a Roman symboldef value(r):     # I in roman is equal to    # 1 in decimal    if (r == 'I'):        return 1     # V in roman is equal to    # 5 in decimal    if (r == 'V'):        return 5     # X in roman is equal to    # 10 in decimal    if (r == 'X'):        return 10             # L in roman is equal to    # 50 in decimal    if (r == 'L'):        return 50     # C in roman is equal to    # 100 in decimal    if (r == 'C'):        return 100     # D in roman is equal to    # 500 in decimal    if (r == 'D'):        return 500     # M in roman is equal to    # 1000 in decimal    if (r == 'M'):        return 1000     return -1 # Function to return the decimal value# of a roman numaraldef romanToDecimal(st):     # Initialize result    res = 0     # Traverse given input    i = 0    while i < len(st):         # Getting value of symbol s[i]        s1 = value(st[i])         if (i + 1 < len(st)):             # Getting value of symbol s[i+1]            s2 = value(st[i + 1])             # Comparing both values            if (s1 >= s2):                 # Value of current symbol                # is >= the next symbol                res = res + s1                         else :                 # Value of current symbol                # is < the next symbol                res = res + s2 - s1                i += 1                 else :            res = res + s1                     i += 1         return res # Function to sort the array according to# the increasing orderdef sortArr(arr, n):     # Vector to store the roman to integer    # with respective elements    vp = {}     # Inserting roman to integer    # with respective elements in vector pair    for i in range(n):        p = romanToDecimal(arr[i])        vp[p] = arr[i]     # Sort the vector, this will sort the pair    # according to the increasing order.    for i in sorted(vp):        print(vp[i], i) # Driver codeif __name__ == "__main__":         arr = [ "MCMIV", "MIV",            "MCM", "MMIV" ]    n = len(arr)     sortArr(arr, n) # This code is contributed by chitranayal
// C# program to sort an array of// Roman Numerals in ascending orderusing System;using System.Collections;using System.Collections.Generic; class ABC : IComparer<Pair>{    public int Compare(Pair p1, Pair p2)    {        if (p1.x == 0 || p2.x == 0)        {            return 0;        }                   // CompareTo() method        return p1.x.CompareTo(p2.x);    }} // User defined Pair classpublic class Pair{    public int x;    public string y;         public Pair(int a, string b)    {        this.x = a;        this.y = b;    }} class GFG{     // Function to return the value// of a Roman symbolstatic int value(char r){         // I in roman is equal to    // 1 in decimal    if (r == 'I')        return 1;     // V in roman is equal to    // 5 in decimal    if (r == 'V')        return 5;     // X in roman is equal to    // 10 in decimal    if (r == 'X')        return 10;     // L in roman is equal to    // 50 in decimal    if (r == 'L')        return 50;     // C in roman is equal to    // 100 in decimal    if (r == 'C')        return 100;     // D in roman is equal to    // 500 in decimal    if (r == 'D')        return 500;     // M in roman is equal to    // 1000 in decimal    if (r == 'M')        return 1000;     return -1;} // Function to return the decimal value// of a roman numaralstatic int romanToDecimal(string str){         // Initialize result    int res = 0;     // Traverse given input    for(int i = 0; i < str.Length; i++)    {                 // Getting value of symbol s[i]        int s1 = value(str[i]);         if (i + 1 < str.Length)        {                         // Getting value of symbol s[i+1]            int s2 = value(str[i + 1]);             // Comparing both values            if (s1 >= s2)            {                                 // Value of current symbol                // is >= the next symbol                res = res + s1;            }            else            {                 // Value of current symbol                // is < the next symbol                res = res + s2 - s1;                i++;            }        }        else        {            res = res + s1;        }    }    return res;} // Function to sort the array according to// the increasing orderstatic void sortArr(String[] arr, int n){         // Vector to store the roman to integer    // with respective elements    List<Pair> vp = new List<Pair>();     // Inserting roman to integer    // with respective elements in vector pair    for(int i = 0; i < n; i++)    {        vp.Add(new Pair(romanToDecimal(arr[i]),                                       arr[i]));    }     // Sort the vector, this will sort the pair    // according to the increasing order.    ABC gg = new ABC();    vp.Sort(gg);     // Print the sorted vector content    for(int i = 0; i < vp.Count; i++)        Console.WriteLine(vp[i].y + " " +                          vp[i].x + "\n");} // Driver Codestatic public void Main (){     string[] arr = { "MCMIV", "MIV", "MCM", "MMIV" };    int n = arr.Length;     sortArr(arr, n);}} // This code is contributed by akhilsaini
<script> // JavaScript implementation of// the above approach // Function to return the value// of a Roman symbolfunction value(r){    // I in roman is equal to    // 1 in decimal    if (r == 'I')        return 1;     // V in roman is equal to    // 5 in decimal    if (r == 'V')        return 5;     // X in roman is equal to    // 10 in decimal    if (r == 'X')        return 10;     // L in roman is equal to    // 50 in decimal    if (r == 'L')        return 50;     // C in roman is equal to    // 100 in decimal    if (r == 'C')        return 100;     // D in roman is equal to    // 500 in decimal    if (r == 'D')        return 500;     // M in roman is equal to    // 1000 in decimal    if (r == 'M')        return 1000;     return -1;} // Function to return the decimal value// of a roman numaralfunction romanToDecimal(str){    // Initialize result    var res = 0;     // Traverse given input    for (var i = 0; i < str.length; i++) {         // Getting value of symbol s[i]        var s1 = value(str[i]);         if (i + 1 < str.length) {             // Getting value of symbol s[i+1]            var s2 = value(str[i + 1]);             // Comparing both values            if (s1 >= s2) {                 // Value of current symbol                // is >= the next symbol                res = res + s1;            }            else {                 // Value of current symbol                // is < the next symbol                res = res + s2 - s1;                i++;            }        }        else {            res = res + s1;        }    }    return res;} // Function to sort the array according to// the increasing orderfunction sortArr(arr, n){    // Vector to store the roman to integer    // with respective elements    var vp = new Array(n);    // Inserting roman to integer    // with respective elements in vector pair    for (var i = 0; i < n; i++) {        vp[i] = [romanToDecimal(arr[i]),arr[i]];    }     // Sort the vector, this will sort the pair    // according to the increasing order.    vp.sort();     // Print the sorted vector content    for (var i = 0; i < n; i++)        document.write(vp[i][1]+" "+vp[i][0]+"<br>");} // Driver Codevar arr = ["MCMIV", "MIV",           "MCM", "MMIV"];var n = arr.length;sortArr(arr, n); </script>
MIV 1004
MCM 1900
MCMIV 1904
MMIV 2004
 
Time Complexity: O(N * log(N)), where N is the number of elements in the array.
Auxiliary Space: O(N) 
ukasp
akhilsaini
SHUBHAMSINGH10
souravmahato348
Arrays
Mathematical
Sorting
Arrays
Mathematical
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.