AIZU ONLINE JUDGE

AOJ ITP1 6_C(Official House)を解く

AOJ_ITP1_6_C

Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)の6_C問題をC++とPython で解いてみました。

ITP1 のトピック6では、配列について学びます。「データの列を1つの変数として管理する配列を習得します。」とあります。Python では、リストに該当します。この学習コースを通じて、Python に慣れていきたいと考えています。

問題(6_C: Official House)

問題はリンク先をご覧ください。

AOJ ITP1 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 の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA