こんにちは! mnbd(@mnbbbbbd)です。
プログラミング初心者なので、もっといい回答があるに違いありません。
あくまでも「動作はする」サンプルとしてご覧ください。
問題文
n 個の整数を含む数列 S と、q 個の異なる整数を含む数列 T を読み込み、T に含まれる整数の中で S に含まれるものの個数 C を出力するプログラムを作成してください。
入力
1行目に n、2行目に S を表す n 個の整数、3行目に q、4行目に T を表す q 個の整数が与えられます。出力
https://onlinejudge.u-aizu.ac.jp/courses/lesson/1/ALDS1/4/ALDS1_4_B
C を1行に出力してください。
解答
#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)
以上です。
読んでいただきありがとうございました!