Prijatelji bi se radi v petek dogovorili za urico ob soku, a imajo težave pri iskanju skupnega prostega termina. Pomagaj jim s funkcijo SkupneProsteUre(prosteUre)
, ki sprejme tabelo množic prostih ur posameznih oseb in vrne množico ur, ob katerih so vse osebe proste.
Za primer vzemimo, da je tabela prosteUre
videti tako:
[ {15, 17, 18, 19}, {14, 17, 19, 21}, {17, 19, 22}, {16, 17, 18, 19, 20} ]
V tem primeru se lahko dobijo bodisi ob 17. ali pa ob 19. uri. Rezultat je torej množica {17, 19}
.
Poiskati moramo torej vse elemente (proste ure), ki nastopajo v vseh množicah. Ti elementi tvorijo ravno presek vseh množic. Presek množic v tabeli izračunamo na podoben način, kot bi na primer izračunali vsoto števil v tabeli.
Ustvarimo pomožno množico, recimo ji m
, in jo nastavimo na kopijo prve množice v tabeli (prosteUre[0]
). Nato se sprehodimo po tabeli prosteUre
in vsakokrat izračunamo presek množice m
in trenutne množice v tabeli. Rezultat ponovno zapišemo v množico m
. Po prvem obhodu zanke bo množica m
(še vedno) enaka množici prosteUre[0]
, po drugem pa bo vsebovala skupne elemente prvih dveh množic v tabeli prosteUre
(torej presek množic prosteUre[0]
in prosteUre[1]
). Po tretjem obhodu bo množica m
vsebovala skupne elemente prvih treh množic itd. Zapišimo našo funkcijo:
Kaj bi se zgodilo, če bi stavek m = prosteUre[0].copy()
nadomestili s preprostejšim m = prosteUre[0]
? Funkcija bi sicer še vedno delovala pravilno, bi pa imela nepričakovan stranski učinek, saj bi spremenila del svojega vhoda – množico prosteUre[0]
! Če ne razumeš, zakaj, si oglej tole.
Napiši in preizkusi funkcijo ProsteUreZaVsajEnoOsebo(prosteUre)
, ki sprejme tabelo množic prostih ur posameznih oseb in vrne množico vseh ur, v katerih je vsaj ena oseba prosta. V zgornjem primeru bi funkcija vrnila to množico:
{14, 15, 16, 17, 18, 19, 20, 21, 22}