Parseador de Numeros Romanos - FreeCodeCamp #28 Daily Challenge

1 min

Parseador de Números Romanos: Análisis y Solución

1. Enunciado

Dado un string con un número romano, devuelve su valor entero. Ejemplo: “MCMXCIV” → 1994.

LetraValor
I1
V5
X10
L50
C100
D500
M1000

Regla clave: Si una letra menor precede a una mayor, se resta; si no, se suma.


2. Análisis Inicial

  • ¿Qué pide? Convertir números romanos a enteros, respetando reglas de suma/resta.

Casos de prueba

EntradaSalida esperada
III3
IV4
IX9
LVIII58
MCMXCIV1994
XLII42
CDXLIV444
MMXXI2021
DCCC800

3. Solución y Código

Estrategia:

  1. Mapear cada letra a su valor.
  2. Recorrer el string de izquierda a derecha.
  3. Si el valor actual es menor que el siguiente, restar; si no, sumar.
// Mapeo de valores
const valores: Record<string, number> = {
  I: 1,
  V: 5,
  X: 10,
  L: 50,
  C: 100,
  D: 500,
  M: 1000
}

function parsearRomano(s: string): number {
  let total = 0
  for (let i = 0; i < s.length; i++) {
    const actual = valores[s[i]]
    const siguiente = valores[s[i + 1]] ?? 0
    if (actual < siguiente) {
      total -= actual
    }
    else {
      total += actual
    }
  }
  return total
}

Diagrama de flujo

flowchart TD
  A["Inicio"] --> B["Recorrer string"]
  B --> C{"¿Valor actual < siguiente?"}
  C -- Sí --> D["Restar valor actual"]
  C -- No --> E["Sumar valor actual"]
  D --> F["Siguiente letra"]
  E --> F
  F --> G{"¿Fin del string?"}
  G -- No --> B
  G -- Sí --> H["Devolver total"]

4. Complejidad

  • Temporal: O(n)O(n), una pasada por el string.
  • Espacial: O(1)O(1), el mapa es fijo.

5. Casos Edge

  • String vacío → 0
  • Entrada inválida: asumimos siempre válida
  • Números muy largos: sigue siendo eficiente

6. Reflexiones

  • Mapeo y lógica condicional simple resuelven el problema.
  • El patrón de “mirar adelante” es útil en parsing.
  • Se puede adaptar para validación o extensión a otros sistemas numéricos.

7. Recursos