ALDS1_4_B 二分探索をC++で解いてみた[AIZU ONLINE JUDGE]

AIZU ONLINE JUDGE

こんにちは! mnbd(@mnbbbbbd)です。

プログラミング初心者なので、もっといい回答があるに違いありません。

あくまでも「動作はする」サンプルとしてご覧ください。

問題文

n 個の整数を含む数列 S と、q 個の異なる整数を含む数列 T を読み込み、T に含まれる整数の中で S に含まれるものの個数 C を出力するプログラムを作成してください。

入力
1行目に n、2行目に S を表す n 個の整数、3行目に q、4行目に T を表す q 個の整数が与えられます。

出力
C を1行に出力してください。

https://onlinejudge.u-aizu.ac.jp/courses/lesson/1/ALDS1/4/ALDS1_4_B

解答

#include <bits/stdc++.h>
using namespace std;

bool binary_search(int S[], int n, int key) {
	int left = 0;
	int right = n;
	while (left < right) {
		int mid = (left + right) / 2;
		if (S[mid] == key) {
			return true;
		} else if (key < S[mid]) {
			right = mid;
		} else {
			left = mid + 1;
		}
	}
	return false;
}

int main() {
	int n;
	cin >> n;
	int S[n];
	for (int i = 0; i < n; i++) {
		cin >> S[i];
	}
	int q;
	cin >> q;
	int T[q];
	for (int i = 0; i < q; i++) {
		cin >> T[i];
	}

	int count = 0;
	for (int i = 0; i < q; i++) {
		if (binary_search(S, n, T[i])) {
			count++;
		}
	}

	cout << count << endl;

	return 0;
}

感想

二分探索を正確に知らなかったので一般解説を見ました。

アルゴリズムの記述がありますが、返り値に見つかった場合の添え字と、見つからなかった場合のNOT_FOUNDをどのように書けばいいのか、わかりませんでした。

結果的に真偽値の書き方になってしまっています。

二分探索は昇順ソートしてあることで、線形探索より圧倒的に速いことを知りました。

まとめ

AIZU ONLINE JUDGEの「ALDS1_4_B 二分探索」を解いてみましたので、その回答と解説をご紹介いたしました。

少しずつですが、プログラミングの勉強をしています。
まだ初心者ですが、よかったらつながっていただけると嬉しいです。
Twitterアカウント(@mnbbbbbd

以上です。
読んでいただきありがとうございました!

タイトルとURLをコピーしました