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