Drill

ProblemsGo › warmup

Write a number in Roman numerals

mediumwarmupMathStringsGreedyGo

A film credit or a chapter heading wants MCMXCIV rather than 1994.

toRoman(amount: int) → string

Go needs a compiler and Drill does not host one yet, so this page is the reference rather than an exercise: the problem, worked examples, and the solution in full. To type it out, the same problem runs in Python.

Solve it in Python →

Where you start

func toRoman(amount int) string {
	
}

Worked examples

CallResult
toRoman(1)"I"
toRoman(4)"IV"
toRoman(14)"XIV"
toRoman(1994)"MCMXCIV"

Hint

Keep the values and their symbols in one descending table, including the subtractive pairs. Then it is one greedy pass.

Reference solution in Go
func toRoman(amount int) string {
	if amount < 1 || amount > 3999 {
		return ""
	}
	vals := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
	syms := []string{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}
	n := amount
	result := ""
	for i, v := range vals {
		for n >= v {
			result += syms[i]
			n -= v
		}
	}
	return result
}

The same problem in another language

More warmup problems in Go