A問題 テスト評価
1 2 3 4 5 6 7 8 9 10 |
n = int(input()) if n <=59: print('Bad') elif 60<= n <= 89: print('Good') elif 90<=n<=99: print('Great') elif n==100: print('Perfect') |
C問題 数を3つ選ぶマン
方針
5つの数字から3つの数を選択して合計し、3番目に大きい数を出力する問題です。
5つの数字から3を選択したときの組み合わせの数は10個あります。
いわゆる5C3の計算だと思います。
10回のループを行い、各組み合わせの合計した数をリストに保存します。
組み合わせによっては合計した数が同じ数になるかもしれないので、set関数で重複を取り除きます。
その後、降順でソートしてから3番目に大きい数を出力しました。
解答①
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import math import itertools input_data = map(int, input().split()) #入力 n = math.comb(5,3) #組み合わせの数を計算 array = list(itertools.combinations(input_data,3)) #全ての組み合わせをarrayに格納 sum_array = [] #合計した数を入れるリスト for i in range(len(array)): #arrayの要素数(組み合わせの数)だけループ sum=0 for j in range(3): #それぞれの組み合わせには3つの数があるため sum += int(array[i][j]) #3つの数を合計 sum_array.append(sum) #合計した数をリストに格納 sum_array=set(sum_array) #重複を排除 sum_array=list(sum_array) #リストに戻す(set型はsum_array[n]というインデックスを使った要素の取り出しができないため) sum_array=sorted(sum_array,reverse=True) #降順でソート print(sum_array[2]) #3番目に大きい数を出力 |
math.comb()は組み合わせの数(10通り)が返ってきます。
解答②
1 2 3 4 5 6 7 8 9 |
import itertools input_data = list(map(int,input().split())) sum_array = [] for a,b,c in itertools.combinations(input_data,3): #itertoolsで5C3を計算し、a,b,cにループ変数として格納 sum_array.append(a+b+c) sum_array.sort(reverse=True) #重複を排除していないように思いますがこれで正解しています。 print(sum_array[2]) |
itertools.combinations()では、for文と組み合わせて3つの変数を使うことで組み合わせの各要素を扱うことができます。math.comb()では組み合わせの数だけが返ってきます。
解答①とは違って、すべての組み合わせを保存したリスト(array)を使っていないので、こちらの解答の方がシンプルでわかりやすいですね。
ただ、重複を取り除く操作を行っていなくても正解しています。
合計した数が[5,5,4,3,・・・]などの場合、sum_array[2]とすると4が出力されて不正解になるような気もするのですが、3番目までに重複しないテストデータだけが使われていたのでしょうか。
コメント