競プロ典型90 004 - Cross Sum(★2)

問題

https://atcoder.jp/contests/typical90/tasks/typical90_d

考察

行列内のマス$(i,j)$にマス$(i,j)$と同じ行と列にあるマスに書かれている整数を全て合計した値を出力する。

つまり、マス$(i,j)$を中心とした行と列の和を求める問題。

まず、答え用の行列を保存する変数$B$を作成。 その際にBを0で初期化する。

次にマス$(i, j)$の行の和をそれぞれ求める。

その後、マス$(i, j)$を除いた列の和をそれぞれ求める。

解説みた

どうやらこのやり方を包除原理と呼ぶらしい。

「重複しているところを足したり引いたりする」ことを包除原理と呼ぶ

参考:https://drken1215.hatenablog.com/entry/2021/07/25/215000

提出コード

H, W = map(int,input().split())

A = [list(map(int,input().split())) for _ in range(H)]

B = [[0] * W for _ in range(H)]

for i in range(H):
  tmp_row_sum = sum(A[i])
  B[i] = [tmp_row_sum] * W

for j in range(W):
  tmp_col_sum = 0
  for i in range(H):
    tmp_col_sum += A[i][j]
  for i in range(H):
    B[i][j] += tmp_col_sum - A[i][j]

for i in range(H):
  print(*B[i])