Guide for Passant llista
Com abordar aquest problema
Se't dona una llista de "Nom Cognom", un per línia, i has d'imprimir-los ordenats pel cognom (i \ pel nom si hi ha empat de cognom). A l'hora d'imprimir cada persona, només cal afegir el cognom si \ el seu nom de pila no és únic dins de tota la classe; si el nom ja identifica clarament a la \ persona, n'hi ha prou amb el nom.
Idea general:
- Llegeix totes les línies de l'entrada (fins que s'acabi), separant cada una en nom i cognom, i \ guarda-les totes en una llista.
- Fes servir una estructura de tipus taula de hash (un diccionari /
HashMap) per comptar quantes \ vegades apareix cada nom de pila dins de tota la llista. - Ordena la llista de persones per cognom, i quan coincideixi el cognom, per nom.
- Recorre la llista ja ordenada: per cada persona, si el comptador del seu nom és més gran que 1, \ imprimeix "Nom Cognom"; si és 1, imprimeix només el "Nom".
Paranys habituals:
- Cal fer el recompte de noms sobre tota la llista abans de decidir què s'imprimeix per a cada \ persona (no es pot decidir mirant-ne només una part).
- L'ordenació és pel cognom; el nom només es fa servir per desempatar quan dos cognoms coincideixen.
- L'entrada pot tenir fins a 200 línies i no se't diu explícitament quantes seran: llegeix fins que \ s'acabi l'entrada.
Pista per a Python
Fes servir un dict (o collections.Counter) per comptar noms de pila, i sorted amb una clau \
composta per ordenar per cognom i després per nom:
import sys
from collections import Counter
persones = []
for linia in sys.stdin:
linia = linia.strip()
if not linia:
continue
nom, cognom = linia.split()
persones.append((nom, cognom))
comptador_noms = Counter(nom for nom, cognom in persones)
persones_ordenades = sorted(persones, key=lambda p: (p[1], p[0]))
for nom, cognom in persones_ordenades:
if comptador_noms[nom] > 1:
print(f"{nom} {cognom}")
else:
print(nom)