GeeksforGeeks App
Open App
Browser
Continue

# Sort an array of Roman Numerals in ascending order

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++

 `// C++ program to sort an array of``// Roman Numerals in ascending order` `#include ``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 > 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 vp)``    ``{``        ` `        ``// Comparator to sort the pair according``        ``// to first element``        ``Collections.sort(vp, ``new` `Comparator()``        ``{``            ``@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 vp = ``new` `ArrayList();` `    ``// 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``{``    ``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 vp = ``new` `List();` `    ``// 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

 ``

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)

My Personal Notes arrow_drop_up