JSFiddle - React, Tailwind, and code Playground

JavaScript

// Problema 1

function romanizar(n){
    var values = [1, 5, 10, 50, 100, 500, 1000], letras = ['I', 'V', 'X', 'L', 'C', 'D', 'M'];
    var res = [];
    var num, letra;
    
    for(var i = 6; num = values[i], letra = letras[i]; i--){
        if(n / num >= 1){ // Suficientemente grande
        
            var r = ~~(n / num); // Número de letras repetidas
            n -= r * num; // Restamos
            
            if(r < 4){ // Normal
                while(r--){ res.push(letra); } // Metemos las letras
            } else { // No se pueden repetir 4+ veces
                var val = res.pop(); // Última letra
                var pos = (val ? letras.indexOf(val) : i) + 1; // Si es el string vacío o letra == "M" (no hay anterior) usamos la letra anterior a esta
                var insert = letra + (letras[pos] || 'M'); // Y si letra == "M" -> letras[pos] no existirá y usamos M a pelo
                res.push(insert); // Insertamos el string
            }
        } else { // Si no vamos a poner letra usamos un "" para que no afecte pop
            res.push('');
        }
    }
    
    return res.join('');
}

var ns = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, 69, 450, 666, 999, 1444, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016];
ns.forEach(function(act){ document.write(act + ' : ' + romanizar(act) + '<br />'); });