問題
Bランクレベルアップメニュー Python3編
この問題で非常に悩みました。
ランクC相当にしては正答率が低く、執筆時点で50%強。
これまでのステップを踏まえても簡単にコーディングできなそうだったので、ゼロから考え直しました。
解答方針
- 入力データを二次元リストに入れる
1列目(インデックス0): 文字
2列目(インデックス1): 数値 - キー文字の集合を作る(キー文字の重複を削除する)
- 二次元リスト内のキー文字に対応する数値の合計値を求め、キー文字と合計値を要素に持つ二次元リストを作る(2,3を関数で行う)
- 2列目のデータ(合計値)をキーとして降順ソートを行う
- キー文字と合計値をスペース区切りで出力する
入力部
データ行数を入力したあと、文字と数値の組をリストに入れます。
一旦、入力行を文字列のまま配列に入れ、あとからインデックス1をint
関数で整数にしています。
入力データ
5
A -2
E 0
W -5
A -1
E -20
入力部コード
n = int(input())
# 入力データを一旦文字列のまま配列に入れる
a_list = [list(map(str, input().split())) for i in range(n)]
# 2列目のデータを整数にする
for data in a_list:
data[1] = int(data[1])
リストに入った入力データ
[['A', -2], ['E', 0], ['W', -5], ['A', -1], ['E', -20]]
関数部
文字データの重複を削除し、キー文字集合を作ります。
引数であるリストの、キー文字ごとの合計数を求めて結果リストresult
を返します。ここではリスト内包表記でコーディング。
リスト内の条件に一致する要素に対する操作は、こちらを参考にしました。
文字に対する数値の合計を求める関数の定義
def sum_up_duplication(arry):
# 検索キーの集合を作る
keys = []
for i in range(len(arry)):
keys.append(arry[i][0])
keys = set(keys)
# 検索キーごとの数値の合計をリストにする
result = []
for k in keys:
result.append([k, sum(x[1] for x in arry if x[0]==k)])
return result
関数呼び出し
sumup = sum_up_duplication(a_list)
関数の戻り値(リスト)
[['A', -3], ['E', -20], ['W', -5]]
出力部
インデックス1の値に基づいて降順ソートします。
結果をスペース区切りで出力するため、join
関数を使います。
出力部コード
# 合計値をキーとして降順ソートし、問題が指定する形式で表示する
sumup2 = sorted(sumup, key=lambda x: x[1], reverse=True)
for _ in sumup2:
print(" ".join(map(str, _)))
出力
A -3
W -5
E -20
提出コード
以上を踏まえ、提出コードは以下のようになりました。これにて100点頂きました。以上です。
# coding: utf-8
# 自分の得意な言語で
# Let's チャレンジ!!
def sum_up_duplication(arry):
# 検索キーの集合を作る
keys = []
for i in range(len(arry)):
keys.append(arry[i][0])
keys = set(keys)
# 検索キーごとの数値の合計をリストにする
result = []
for k in keys:
result.append([k, sum(x[1] for x in arry if x[0]==k)])
return result
n = int(input())
# 入力データを一旦文字列のまま配列に入れる
a_list = [list(map(str, input().split())) for i in range(n)]
# 2列目のデータを整数にする
for data in a_list:
data[1] = int(data[1])
sumup = sum_up_duplication(a_list)
# 合計値をキーとして降順ソートし、問題が指定する形式で表示する
sumup2 = sorted(sumup, key=lambda x: x[1], reverse=True)
for _ in sumup2:
print(" ".join(map(str, _)))