Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)の6_C問題をC++とPython で解いてみました。
ITP1 のトピック6では、配列について学びます。「データの列を1つの変数として管理する配列を習得します。」とあります。Python では、リストに該当します。この学習コースを通じて、Python に慣れていきたいと考えています。
問題(6_C: Official House)
問題はリンク先をご覧ください。
3次元配列を使って、問題を解きます。
解答案
C++ プログラム例(ITP1 6_C)
校舎の各部屋の入居人数を3次元配列で表現します。このような問題は、配列に合わせて0オリジン(0から考える)とするか、問題に合わせて1オリジン(1から考える)とするか決める必要があります。
今回は、問題文に合わせて1オリジンとしました。そのため、3次元配列の要素を1個余分に確保しています。
入居人数を0人で初期化しました(10行目)。棟と階、部屋番号を読み込み、入居人数を記録して、最後に表示しました。
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int room[5][4][11] = {0};
for (int i = 0; i < n; ++i) {
int b, f, r, v;
cin >> b >> f >> r >> v;
room[b][f][r] += v;
}
for (int i = 1; i <= 4; ++i) {
for (int j = 1; j <= 3; ++j) {
for (int k = 1; k <= 10; ++k) {
cout << " " << room[i][j][k];
}
cout << endl;
}
if (i != 4) {
cout << "####################" << endl;
}
}
return 0;
}
多次元の配列に慣れれば、自然と読めるプログラムだと思います。
Python プログラム例(ITP1 6_C)
Python では、リストを使います。3次元のリストを定義して、読み込んだ情報に従い、入居人数を更新しました。最後に出力しています。プログラムの構造は、C++ 版と同じです。
n = int(input())
room = [[[0 for i in range(11)] for j in range(4)] for k in range(5)]
for i in range(n):
b, f, r, v = map(int, input().split())
room[b][f][r] += v
for i in range(1, 5):
for j in range(1, 4):
for k in range(1, 11):
print(f" {room[i][j][k]}", end="")
print("")
if i != 4:
print("####################")
上記プログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されます。
最後に
多次元の配列(リスト)が使えるようになると、応用範囲が広がっていきます。この問題は、簡単な例ですが、校舎の入居人数をシミュレーションしていると言えます。
引き続き、ITP1 の問題を紹介していきます。