Saltar al contenido
Regresar

Altura Máxima Coincidente: Cilindros y Conjuntos en Python

Publicado:  a las  09:01 p.m.

¿Te imaginas apilando cilindros de diferentes alturas buscando el punto perfecto donde todos coincidan? 🤔 ¡Es un desafío de optimización con sabor a Tetris!

🔮 Enunciado del Problema

El problema que abordamos es el de encontrar la máxima altura común entre múltiples pilas de cilindros, donde cada cilindro tiene el mismo diámetro pero alturas variables dentro de cada pila. Formalmente:

🧩 Resolución Paso a Paso

Para resolver este problema, adoptamos una estrategia basada en conjuntos y sumas acumuladas. Cada pila se transforma en un conjunto de posibles alturas alcanzables, y luego buscamos la intersección de estos conjuntos.

Primero, necesitamos una función que calcule las posibles alturas alcanzables en una pila dada:

def get_sum_stack(stack):
	acc = 0
	sum_stack = set()
	for n in stack:
		acc += n
		sum_stack.add(acc)
	return sum_stack

Este bloque de código itera sobre cada cilindro de la pila, acumulando sus alturas en la variable acc. Por cada altura acumulada, la agregamos al conjunto sum_stack. El conjunto garantiza que no haya alturas duplicadas, lo cual simplifica las operaciones posteriores. La lógica de utilizar un conjunto es que este almacena las alturas posibles de cada una de las pilas, haciendo más eficiente encontrar la intersección entre las alturas de las pilas.

Luego, implementamos la función principal que encuentra la altura coincidente máxima:

def equal_height(stacks):
	"level: medium; points: 5"
	result = get_sum_stack(stacks[0])
	for stack in stacks:
		result &= get_sum_stack(stack)
	return max(result) if len(result) > 0 else 0

Este bloque comienza inicializando result con el conjunto de alturas posibles de la primera pila. Después, itera sobre las pilas restantes, realizando una intersección con result. La intersección (operador &=) mantiene solo las alturas que son comunes a todas las pilas. Finalmente, si el conjunto resultante no está vacío, retorna la altura máxima; de lo contrario, retorna 0.

Solución Completa:

def get_sum_stack(stack):
	acc = 0
	sum_stack = set()
	for n in stack:
		acc += n
		sum_stack.add(acc)
	return sum_stack

def equal_height(stacks):
	"level: medium; points: 5"
	result = get_sum_stack(stacks[0])
	for stack in stacks:
		result &= get_sum_stack(stack)
	return max(result) if len(result) > 0 else 0

🧠 Conceptos Clave

La solución se apoya en varios conceptos clave:

💫 Reflexiones Finales

Una posible mejora sería optimizar la función get_sum_stack para evitar recalcular las sumas acumuladas en cada iteración de equal_height, aunque el costo en términos de complejidad asintótica es mínimo y el código actual es más legible.

¿Sabías que…? 🤔 La eficiencia de la intersección de conjuntos en Python (implementada en C bajo el capó) hace que esta solución sea sorprendentemente rápida, incluso para grandes cantidades de pilas y cilindros.

¡Espero que este viaje por las alturas coincidentes haya sido revelador! Si te interesa explorar más algoritmos y estructuras de datos, ¡no dudes en seguir leyendo! ¡Te espero en el próximo artículo para seguir expandiendo juntos nuestros horizontes de programación! 🚀



Publicación anterior
Calcula tu Crédito Fintech: Comisión, IVA y Monto a Solicitar
Siguiente publicación
Decimal a Binario: Convierte Números con Python (Paso a Paso)