[AIZU ONLINE JUDGE]「ITP1_7_C 表計算」をC++で解いてみた

AIZU ONLINE JUDGE

こんにちは! mnbd(@mnbbbbbd)です。

AIZU ONLINE JUDGEの「ITP1_7_C 表計算」を解いてみましたので、その回答と解説をご紹介いたします。

プログラミング初心者なので、もっといい回答があるに違いありません。

あくまでも「動作はする」サンプルとしてご覧ください。

問題文

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

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

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

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

https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/7/ITP1_7_C

回答

#include <bits/stdc++.h>
using namespace std;

int main() {
    int r, c;
    cin >> r >> c;
    int table[r + 1][c + 1] = {};
    for(int i = 0; i < r; i++) {
        for(int j = 0; j < c; j++) {
            cin >> table[i][j];
        }
    }
    for(int i = 0; i < r; i++) {
        for(int j = 0; j < c; j++) {
            table[i][c] += table[i][j];
            table[r][j] += table[i][j];
        }
    }
    for(int j = 0; j < c; j++) {
        table[r][c] += table[r][j];
    }
    for(int i = 0; i < r + 1; i++) {
        for(int j = 0; j < c + 1; j++) {
            cout << table[i][j];
            if(j != c) {
                cout << " ";
            }
        }
        cout << endl;
    }
}

解説

まず、r(行)とc(列)を入力で得た数値の二次元配列を一行一列大きく確保します。

次に二次元配列の値を入力で得ます。

得た数値を順次最も右側の列に足して合計にしてます。

行についても同じ要領で、得た数値を順次最も下側の行に足して合計にしてます。

下側の行の合計が出揃ったところで、もう一度ループで得た数値を順次最も右側の列に足して合計にしています。

最後に二次元配列を表示しています。

単純に数値の間に空白を入れてしまうと、PE(PRESENTATION ERROR)になりますので、最後列のみ空白を出力しないようにしてます。

私がハマったポイント

二次元配列の添字がうまく頭にイメージできずになかなかコードに落とし込めませんでした。

何度か試行錯誤することで形になりましたが、よいやり方とは言えませんね。

学んだこと

配列の初期化をしておいた方があとあと楽ですし、エラーもでないかと思います。

配列の添字をちゃんとイメージできるようになりたいところです。

まとめ

AIZU ONLINE JUDGEの「ITP1_7_C 表計算」を解いてみましたので、その回答と解説をご紹介いたしました。

私はまだ初心者ですが、よかったら一緒に勉強していきましょう。

Twitterなどをフォローしていただければ幸いです。

以上です。
読んでいただき、ありがとうございました!