💻

AtCoder - Cross Sum -

2024/09/23に公開

AtCoder Cross Sum

問題リンク

AtCoder Typical90 D

解法

この問題では、各マスに対して、同じ行または同じ列にあるマスの値の合計を求める必要があります。以下のアプローチで解きます。

アプローチ

  1. 行ごとの合計と列ごとの合計を計算

    • 各行の合計をrow_sumsに格納します。
    • 各列の合計をcol_sumsに格納します。
  2. 各マスの答えを計算

    • マス(i, j)の答えは「行iの合計」+「列jの合計」から「マス(i, j)」の値を引いたものです。

ステップ

  1. 行ごとの合計を計算する。
  2. 列ごとの合計を計算する。
  3. マス(i, j)における結果を、row_sums[i] + col_sums[j] - A[i][j]で求める。
  4. 結果を出力します。

Python実装

# 入力の受け取り
H, W = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(H)]

# 行ごとの合計
row_sums = [sum(row) for row in A]

# 列ごとの合計
col_sums = [sum(A[i][j] for i in range(H)) for j in range(W)]

# 答えを計算して出力
for i in range(H):
    result_row = []
    for j in range(W):
        # (i, j)の値を含む行と列の合計
        result = row_sums[i] + col_sums[j] - A[i][j]
        result_row.append(result)
    # 出力(スペース区切りで1行ずつ)
    print(' '.join(map(str, result_row)))

説明

  1. row_sums は各行の合計を保持するリストです。
  2. col_sums は各列の合計を保持するリストです。
  3. result = row_sums[i] + col_sums[j] - A[i][j] で、行と列の合計から重複してカウントされたマス(i, j)の値を引いています。
  4. 最後に各行の結果をスペース区切りで出力しています。

Discussion