AIZU ONLINE JUDGE ITP1_7_Cをpythonで解いてみた

python

AIZU ONLINE JUDGE ITP1_7_C はこちらから

目次

問題:表計算

表計算を行う簡単なプログラムを作成します。

表の行数rと列数c、r × c の要素を持つ表を読み込んで、各行と列の合計を挿入した新しい表を出力するプログラムを作成して下さい。

Input

最初の行にrとcが空白区切りで与えられます。続くr行にそれぞれc個の整数が空白区切りで与えられます。

Output

(r+1) × (c+1) の新しい表を出力して下さい。各行の隣り合う整数は1つの空白で区切って下さい。各行の最後の列としてその行の合計値を、各列の最後の行としてその列の合計値を、最後の行・列に表全体の合計値を挿入して下さい。

Constraints

  • 1 ≤ r, c ≤ 100
  • 0 ≤ 要素 ≤ 100

Sample Input

4 5
1 1 3 4 5
2 2 2 4 5
3 3 0 1 1
2 3 4 4 6

Sample Output

1 1 3 4 5 14
2 2 2 4 5 15
3 3 0 1 1 8
2 3 4 4 6 19
8 9 9 13 17 56

解答例

r, c = map(int, input().split())
sheet = [list(map(int, input().split())) for i in range(r)]

for i in range(r):
    sheet[i].append(sum(sheet[i]))

Column_sum = [0]*(c+1)
for j in range(c+1):
    for k in range(r):
        Column_sum[j] += sheet[k][j]

for i in range(r):
    print(*sheet[i])
print(*Column_sum)

解説

以下のように解いていきます。

  1. 2つの整数の読み込み
  2. r × cの要素の読み込み
  3. 行の合計値の計算とリストへの追加
  4. 列の合計値の計算とリストへの追加
  5. 行列の合計値を含む(r+1) × (c+1)の表の表示

ここではmap関数を使用します。第二引数のinput().split()で空白区切りの文字列を取得した値を、一つずつint関数に当てはめてint型に変換、r, cに設定していきます。

# input().split()で空白区切りの文字列を取得 → intに変換 → r, c に設定
r, c = map(int, input().split())

※サイト内「AIZU ONLINE JUDGE ITP1_1_Cをpythonで解いてみた」の、map関数とはにmap関数の使用方法が書かれておりますのでぜひご覧ください。

まず、map関数を使用し、c個の数字の入力を行います。第二引数のinput().split()で空白区切りの文字列を取得した値を、一つずつint関数に当てはめてint型に変換、さらに、list関数で囲みます。

続いて、for文のイテラブルにrange(r)を設定し、c個の数字の入力処理であるlist(map(int, input().split()))をr回行います。

これでc個の数字のかたまりが、r個のリストが作成されます。

# input().split()で空白区切りの文字列を取得 → intに変換 → list関数で囲み、リストとしてc個の数値を受け取る
# さらに【for _ in range(n)】でc個の数値の受け取りをr回行う
sheet = [list(map(int, input().split())) for i in range(r)]

※サイト内「AIZU ONLINE JUDGE ITP1_6_Bをpythonで解いてみた」の、リスト内包表記とはにリスト内包表示の使用方法が書かれておりますのでよかったらご覧ください。

2で行列の読み込みを行いましたが、ここでは行の合計値を追加します。

sum関数を使用しsheetの各要素の合計値を求め、append関数でsheetの各要素の最後に追加します。

# 0〜rまで順番にiに設定、r回ループを回す
for i in range(r):
    # sheetの各要素の合計値を計算 → リストの最後に追加
    sheet[i].append(sum(sheet[i]))

まずは、列の合計値追加用の配列を各要素は0として用意します。そして、その配列に列の合計値を追加します。

外側のfor文のイテラブルにrange(c+1)を設定し変数jに設定します。また、内側のイテラブルにrange(r)を設定し、変数kに設定します。

そして、sheet[k][j]番目の合計値を計算し、列(縦)の合計値を先ほど用意した配列(Column_sum)に追加します。

# 列の合計値追加用の配列(Column_sum)を用意、全て0をセット
Column_sum = [0]*(c+1)
# 列の合計値を合計値追加用の配列(Column_sum)に設定
for j in range(c+1):
    for k in range(r):
        Column_sum[j] += sheet[k][j]

3で求めた元の配列に行の合計値を追加した配列(sheet)を先に表示した後に、4で求めた列の合計値の配列(Column_sum)を表示します。配列の前にアスタリスク(*)を付けることで、配列の要素のみ表示する事ができます。

# 列の合計値の配列の表示
for i in range(r):
    print(*sheet[i])
# 列の合計値の配列の表示
print(*Column_sum)

最後に、もう一度プログラムを確認してみましょう。

# input().split()で空白区切りの文字列を取得 → intに変換 → r, c に設定
r, c = map(int, input().split())
# input().split()で空白区切りの文字列を取得 → intに変換 → list関数で囲み、リストとしてc個の数値を受け取る
# さらに【for _ in range(n)】でc個の数値の受け取りをr回行う
sheet = [list(map(int, input().split())) for i in range(r)]
# 0〜rまで順番にiに設定、r回ループを回す
for i in range(r):
    # sheetの各要素の合計値を計算 → リストの最後に追加
    sheet[i].append(sum(sheet[i]))
# 列の合計値追加用の配列(Column_sum)を用意、全て0をセット
Column_sum = [0]*(c+1)
# 列の合計値を合計値追加用の配列(Column_sum)に設定
for j in range(c+1):
    for k in range(r):
        Column_sum[j] += sheet[k][j]
# 列の合計値の配列の表示
for i in range(r):
    print(*sheet[i])
# 列の合計値の配列の表示
print(*Column_sum)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

雇われのシステムエンジニアです。
普段は車載ECUのセキュリティー分野に従事しております。

■保有資格
Salesforce 認定 Platform アプリケーションビルダー
Salesforce 認定 Platform デベロッパー

コメント

コメントする

目次