AIZU ONLINE JUDGE

AOJ ITP2 3_A(Min-Max)を解く

AOJ_ITP2_3_A

Aizu Online Judge(AOJ)が提供している「プログラミング応用」(ITP2)の3_A問題をC++で解いてみました。

ITP2では、「プログラミングのための基礎ライブラリを獲得します」とあります。トピック#3では、列に対する操作を学びます。

#3から#6は、alogrithm をインクルードして利用する機能を紹介します。全てのアルゴリズムは、データ構造の実装から切り離されています。アルゴリズムの要件(主にイテレータ)を満たせば動作します。

問題(3_A: Min-Max)

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

AOJ ITP2 3_A問題: Min-Max

最小値を求める min と最大値を求める max について学びます。

std::min, std::max について

以下は、cpprefjp 様の記事(min, max)を参考にさせていただきました。

std::min は、最小値を取得します。std::max は、最大値を取得します。

  template <class T>
  const T& min(const T& a, const T& b);
  const T& max(const T& a, const T& b);  
  T min(initializer_list<T> t);
  T max(initializer_list<T> t);

C++03 までは、2値の比較しかできませんでした。C++11からは、initializer_list により複数の値が指定できます(4、5行目)。

型 T が operator< で比較が可能であれば、使うことができます。

C++ プログラム例(ITP2 3_A)

与えられた3つの整数 a, b, c の最小値と最大値を出力します。 2つの値の最小値、最大値を取得して、もう一度比較しています(11行目)。

以下は、C++のプログラムです。

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
	int a, b, c;
	cin >> a >> b >> c;

	cout << min(a, min(b, c)) << " " << max(a, max(b, c)) << endl;

	return 0;
}

C++11 からは、以下の11行目の表記方法が使えます。こちらの方が、やりたいことが明確に表現できています。

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
	int a, b, c;
	cin >> a >> b >> c;

	cout << min({a, b, c}) << " " << max({a, b, c}) << endl;

	return 0;
}

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

最後に

min や max を使うことにより、多くの場合、条件文を減らすことができます。条件文が減るだけではなく、プログラムの意図がすっきりと表現できるため、積極的に使っていきたい機能だと考えています。

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

COMMENT

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

CAPTCHA