# Codewars Python – Integer to Roman conversion

Codewars Python in its 6kyu Kata has given us a problem to convert an integer into the Roman numeral Symbols. In Ancient Roman times, people use Roman numbers instead of integers.  #### Roman numbers

We can use the Roman symbol for any number.  For e.g instead of 1, we can use I instead of 2 we can use II and instead of 3, we can use III. Remember that we can not use more than 3 identical symbols in a row to show a number. For e.g, we cannot use IIII to represent 4. The Symbols associated with value are: I for 1, V for 5, X for  10,  L for 50,  C for 100, D for 500, and M for 1000. With all these Symbols we can write any number up to 3999.

#### Codewars Python Solution

The Starter Code that Codewars gave us in Python is

```def solution(n):
# TODO convert int to roman string

return```

How will you approach this Kata, Comment?

My approach to the Problem:

Firstly, I made two Lists in Python, first to store the Numbers which have Single Roman Symbol Available and Second List for Roman Symbols.

``````def solution(n):
# TODO convert int to roman string
x = [1000,500,100,50,10,5,1]
symbol = ["M","D","C","L","X","V","I"]
val = 0  // indexing the lists
return_String = ""```` // return Roman String````

Secondly, I started a loop until the Integer given is reduced to 0 the loop goes on.

```        while n != 0:
n   = n % x[val]```

My approach to finding the Roman Number was to divide the number by 1000-500-100-50-10-5-1 one by one to get if the number is greater than a specific symbol. For e.g, if we have to find the Roman Symbol for 125 Dividing it by 1000-500 will not do anything but when divide it by 100 we get 125/100 = 1, where I print the 100 Symbol one time which is C after taking modulus we are left with 25, dividing it by 10, we will get 2 so printing  10 Roman Symbol  two times now over String will be like CXX, after taking modulus again left with 5 which has a Symbol V.   So the returned String = CXXV

``````def solution(n):
# TODO convert int to roman string
x = [1000,500,100,50,10,5,1]
symbol = ["M","D","C","L","X","V","I"]
val = 0
return_String = ""
while n != 0:
z = int(n/x[val])
for i in range(0,z):
return_String = return_String + symbol[val]
n = n % x[val]
val = val+1
return return_String``````

The approach was good but failed on numbers like 4 9, this approach was returning IIII and VIIII respectively. which was wrong. To deal with it I added an if statement that if dividing a number returns 4, it should return the Current symbol concatenated to the previous symbol. For e.g dividing the 4/1 = 4. It should return the current symbol which is I and the Previous symbol which is  V.  Concatenating will return = IV string.

#### Overall Code

``````def solution(n):
# TODO convert int to roman string
x = [1000,500,100,50,10,5,1]
symbol = ["M","D","C","L","X","V","I"]
val = 0
return_String = ""
while n != 0:
z = int(n/x[val])
if z==4:
if(symbol[val - 1] == "X" or symbol[val - 1] == "I" or symbol[val - 1] == "C" or symbol[val - 1] == "M" or return_String == "" ):
return_String = return_String + symbol[val] + symbol[val-1]
elif(return_String != ""):
if(return_String[-1] == symbol[val-1]):
new = return_String[0:-1] + symbol[val] + symbol[val -2]
return_String = new
else:
return_String = return_String + symbol[val] + symbol[val-1]

else:
for i in range(0,z):
return_String = return_String + symbol[val]
n = n % x[val]
val = val+1
return return_String``````

When I run it on Codewars it passed all the tests.