AIZU ONLINE JUDGE

AOJ ITP1 2_C(Sorting Three Numbers)を解く

AOJ_ITP1_2_C

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

COMMENT

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

CAPTCHA