Open In App

Sort an array of Roman Numerals in ascending order

Last Updated : 05 Aug, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report

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. 


Below is the implementation of the above approach:

C++
// 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 symbol
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 numaral
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 order
void 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 code
int main()
{
    string arr[] = { "MCMIV", "MIV",
                     "MCM", "MMIV" };
    int n = sizeof(arr) / sizeof(arr[0]);

    sortArr(arr, n);

    return 0;
}
Java
// Java program to sort an array of
// Roman Numerals in ascending order
import java.io.*;
import java.util.*;

// User defined Pair class
class Pair 
{
    int x;
    String y;
    
    public Pair(int a, String b)
    {
        this.x = a;
        this.y = b;
    }
}

// Class to define user defined conparator
class 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 symbol
static 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 numaral
static 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 order
static 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 Code
public 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
# Python3 program to sort an array of
# Roman Numerals in ascending order

# Function to return the value
# of a Roman symbol
def 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 numaral
def 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 order
def 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 code
if __name__ == "__main__":
    
    arr = [ "MCMIV", "MIV",
            "MCM", "MMIV" ]
    n = len(arr)

    sortArr(arr, n)

# This code is contributed by chitranayal
C#
// C# program to sort an array of
// Roman Numerals in ascending order
using 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 class
public 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 symbol
static 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 numaral
static 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 order
static 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 Code
static public void Main ()
{
     string[] arr = { "MCMIV", "MIV", "MCM", "MMIV" };
    int n = arr.Length;

    sortArr(arr, n);
}
}

// This code is contributed by akhilsaini
JavaScript
<script>

// JavaScript implementation of 
// the above approach

// Function to return the value
// of a Roman symbol
function 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 numaral
function 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 order
function 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 Code
var arr = ["MCMIV", "MIV",
           "MCM", "MMIV"];
var n = arr.length;
sortArr(arr, n);

</script>

Output
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)
 


Next Article
Article Tags :
Practice Tags :

Similar Reads