0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

お題は不問!Qiita Engineer Festa 2023で記事投稿!

Paizaラーニング:文字と整数の組のソート2

Last updated at Posted at 2023-06-21

問題

Bランクレベルアップメニュー Python3編

この問題で非常に悩みました。
ランクC相当にしては正答率が低く、執筆時点で50%強。
これまでのステップを踏まえても簡単にコーディングできなそうだったので、ゼロから考え直しました。

解答方針

  1. 入力データを二次元リストに入れる
    1列目(インデックス0): 文字
    2列目(インデックス1): 数値
  2. キー文字の集合を作る(キー文字の重複を削除する)
  3. 二次元リスト内のキー文字に対応する数値の合計値を求め、キー文字と合計値を要素に持つ二次元リストを作る(2,3を関数で行う)
  4. 2列目のデータ(合計値)をキーとして降順ソートを行う
  5. キー文字と合計値をスペース区切りで出力する

入力部

データ行数を入力したあと、文字と数値の組をリストに入れます。
一旦、入力行を文字列のまま配列に入れ、あとからインデックス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, _)))
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?