AIZU ONLINE JUDGE

AOJ ITP1 6_B(Finding Missing Cards)を解く

AOJ_ITP1_6_B

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

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

問題(6_B: Finding Missing Cards)

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

AOJ ITP1 6_B問題:Finding Missing Cards

配列または set を使って、足りないカードを探します。

解答案

C++ プログラム例(ITP1 6_B)

まず配列を使って解いてみます。2次元 bool 型の配列 cards を用意しました。初期値を false に設定して、読み込んだカードを true に設定しています。

次に、マークと数字で2次元配列を走査して、false のカードを出力しています。キーとなる行の背景色を変更しました。

#include <iostream>
#include <string>

using namespace std;

int main()
{
	int n;
	cin >> n;

	bool cards[4][13+1] = {false};
	string mark_string = "SHCD";
	for (int i = 0; i < n; ++i) {
		char mark;
		int mark_index, number;
		cin >> mark >> number;

		for (int j = 0; j < 4; ++j) {
			if (mark == mark_string[j]) {
				mark_index = j;
				break;
			}
		}
		cards[mark_index][number] = true;
	}

	for (int i = 0; i < 4; ++i) {
		for (int j = 1; j <= 13; ++j) {
			if (cards[i][j] == false) {
				cout << mark_string[i] << " " << j << endl;
			}
		}
	}

	return 0;
}

配列の代わりに set コンテナを使ったプログラムも紹介します。set コンテナに要素を登録(insert)した後に、マークと数字で走査(find)して、見つからなければ、マークと数字を出力しています。こちらもキーとなる行の背景色を変更しました。

set の典型的な使い方をしていると思います。

#include <iostream>
#include <string>
#include <set>

using namespace std;

int main()
{
	int n;
	cin >> n;

	set<pair<char, int>> cards;
	for (int i = 0; i < n; ++i) {
		char mark;
		int number;
		cin >> mark >> number;
		cards.insert(make_pair(mark, number));
	}

	string mark_string = "SHCD";
	for (int i = 0; i < 4; ++i) {
		for (int j = 1; j <= 13; ++j) {
			if (cards.find(make_pair(mark_string[i], j)) == cards.end()) {
				cout << mark_string[i] << " " << j << endl;
			}
		}
	}

	return 0;
}

Python プログラム例(ITP1 6_B)

Python では、set を使ってみます。(マーク, 数字) のタプルを登録して、マークと数字で走査して、見つからなければ出力しています。

cards = set()
n = int(input())
for i in range(n):
    mark, number = input().split()
    number = int(number)
    cards.add((mark, number))

mark_string = "SHCD"
for i in range(4):
    for j in range(1, 14):
        if (mark_string[i], j) not in cards:
            print(mark_string[i], j)

上記プログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されます。

最後に

トピック6では、配列(リスト)について学んでいきます。今回は、配列を使った例も紹介しましたが、問題の性質から set コンテナを使った例も紹介しました。set を使ったほうが、すっきり書けていると思います。

引き続き、ITP1 の問題を紹介していきます。

COMMENT

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

CAPTCHA