b265: Q11286 - Conformity
這篇教學會示範 ZeroJudge 基礎題庫「b265: Q11286 - Conformity」的解題過程。
題目需求
題目會提供一些空白間隔的數字,這些數字表示「一個學生所選的課程代號」,舉例來說「100 101 102 103 488」表示這個學生選了五門課,分別是 100 101 102 103 488,而這五個數字就是「課程組合」,當有許多學生選課時,透過程式選出「最熱門」的課程組合以及選擇這種課程組合的人數。
解答
這題可以使用「用高效迭代器 itertools」的「groupby」方法,找出一個可迭代物件中「相鄰元素」的數量,由於要找「鄉鄰」的元素,要先將課程代號組合成「字串」( 組合前先排序一次 ),再以字串作為尋找的 key,就能找出每個課程組合的人數。
import itertools # 使用高效迭代器 itertools
while True:
try:
n = int(input()) # 學生人數
if n == 0: break # 如果學生人數等於 0 就跳出
a = [] # 建立空串列,進行課程代號的排序
for i in range(n):
at = input().split() # 將課程組合的代號拆成串列
at.sort() # 從小到大排序
a.append(''.join(at)) # 將代號組合成字串,作為排序依序,存入 a 串列中
a.sort() # a 排序
b = itertools.groupby(a) # 使用 itertools.groupby 方法,取得相鄰元素的數量
c = [] # 建立空串列,記錄最熱門課程的人數
for key, val in b:
c.append(len(list(val))) # c 記錄數量
m = max(c) # 取出最大值,就是最熱門課程的人數
co = c.count(m)
if m == 1:
print(len(a)) # 如果最大值是 1,表示所有課程組合都只有一個人選,印出所有組合的數量
else:
print(m*co) # 反之印出熱門組合的數量
except:
break
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~