도와줘/컴퓨터

[BOJ 1920] 수 찾기

정보소 2023. 4. 30. 00:43
728x90

수는 10만개 있는데

쿼리도 10만개이니까

한 번의 쿼리를 O(N)으로 탐색해서는 안 된다.

 

정렬 한 번 한 뒤에

이분탐색으로 찾고자 하는 숫자가 있는지 없는지 알아내면 된다.

 

같은 숫자가 여러개 들어올 때

lower bound나 upper bound를 찾을 때에는 아래와 같이 짜면

틀릴 수 있다.

하지만 지금은 해당 숫자가 '존재하느냐'를 물었기에,

같은 숫자가 있는 경우를 전혀 고려할 필요가 없다.

어차피 [l, r] 내에 찾고자 하는 숫자가 존재할 것이기 때문이다.

 

그리고 이분탐색이 이렇게 티어가 낮았나 싶은데

백준 단계별 풀기는 문제 밑에 힌트를 써주기 때문에

이분탐색인걸 알 수 있는 점도 체감 난이도를 낮추는 데 한 몫 한 것 같다.

(물론 공부를 터레끼만큼이라도 했으면 이 문제가 이분탐색 문제인 걸 알아차리는데 1분도 걸리지 않아야 한다)

 

#include <bits/stdc++.h>

using namespace std;

int n, m;
int a[100000];

int f(int t) {
	int l = 0, r = n - 1;
	while (l <= r) {
		int m = (l + r) >> 1;
		if (a[m] == t) {
			return 1;
		} else if (a[m] < t) {
			l = m + 1;
		} else if (a[m] > t) {
			r = m - 1;
		}
	}
	return 0;
}

int main() {
	cin.sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	sort(a, a + n);
	cin >> m;
	while (m--) {
		int t; cin >> t;
		cout << f(t) << '\n';
	}
	return 0;
}
728x90