Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)の2_C問題をC++とPython で解いてみました。
ITP1 のトピック2では、条件分岐を学びます。「条件によって実行する内容を変え、処理の流れを制御する構造文を学習します。」とあります。この学習コースを通じて、Python に慣れていきたいと考えています。
問題(2_C: Sorting Three Numbers)
問題はリンク先をご覧ください。
AOJ ITP1 2_C問題:Sorting Three Numbers
条件文に慣れるために、3変数のソートを扱います。
解答案
C++ プログラム例(ITP1 2_C)
#include <iostream>
using namespace std;
int main()
{
int a, b, c, t;
cin >> a >> b >> c;
if (a > b) {
t = a;
a = b;
b = t;
}
if (a > c) {
t = a;
a = c;
c = t;
}
if (b > c) {
t = b;
b = c;
c = t;
}
cout << a << " " << b << " " << c << endl;
return 0;
}
3変数のソートをするために、条件文を3回使っています。
このロジックは、それほど複雑ではないですが、間違える可能性があります。また、コメントがないと、一見してソートしていることが分かりません。C++の標準ライブラリであるSTL(Standart Template Library)のソートを使ってみましょう。
以下は、C++ でソートを使ったプログラムです。
// Use STL
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> a(3);
cin >> a[0] >> a[1] >> a[2];
sort(a.begin(), a.end());
cout << a[0] << " " << a[1] << " " << a[2] << endl;
return 0;
}
ライブラリ機能を使って、簡単に書けていることが分かります。
Python プログラム例(ITP1 2_C)
まずソートを使わない例を Python で書いてみましょう。多重代入が使えるため、一時変数が不要になっています。
a, b, c = map(int, input().split())
if a > b:
a, b = b, a
if a > c:
a, c = c, a
if b > c:
b, c = c, b
print(a, b, c)
C++ と同じように Python でもソートを使ってみましょう。
注意)map は、イテレータを返しています。多くの場合、動作に問題ありませんが、今回のようにリストをsortする場合は、「map の返すイテレータは、sort をメンバとして持たない」という趣旨のエラーがでます。list() を使って、リスト化する必要があります。
a = list(map(int, input().split()))
a.sort()
print(a[0], a[1], a[2])
上記プログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されます。
最後に
条件文の演習として、3変数のソートをプログラムしました。このように簡単な場合でも、標準ライブラリを使ったほうが、すっきりと書けることが分かりました。
引き続き、ITP1 の問題を紹介していきます。