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: 2004Input: 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++ 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 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 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# 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 |
<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> |
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)