알고리즘 :: 큰돌 :: Chapter 6 - 이분탐색 :: 백준 2776번 암기왕

Embedded June·2023년 9월 3일
0
post-thumbnail

문제

문제 링크

해설

  • 수첩1과 2가 각각 최대 길이가 100만이므로 가장 쉬운 방법인 O(N²) 방법 (각 수첩2의 요소마다 수첩1을 처음부터 끝까지 탐색하는 방법)을 사용하면 안 됩니다.
  • std::binary_search() 함수를 연습하는 문제입니다.
  • 먼저, 이분탐색을 사용하기 앞서 수첩1의 모든 내용을 std::sort()로 오름차순 정렬합니다.
  • 그 뒤 수첩2의 모든 내용을 std::binary_search()로 찾은 뒤 결괏값을 출력하면 됩니다.
  • 정렬에 O(Nlog₂N), 탐색에 O(log₂N)이 소요됩니다.

코드

1. STL 사용

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

array<int, 1'000'001> note;

int main() {
	cin.tie(0)->sync_with_stdio(0);
	
	int T;
	cin >> T;
	while (T--) {
		int N;
		cin >> N;
		for (int i = 0; i < N; ++i) cin >> note[i];
		
		sort(begin(note), begin(note) + N);
		
		int M;
		cin >> M; 
		for (int i = 0; i < M; ++i) {
			int num;
			cin >> num;
			cout << binary_search(begin(note), begin(note) + N, num) << '\n';
		}
	}
}

2. STL 미사용

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

int T, N, M;
array<int, 1'000'001> note;

bool check(int num) {
	int l = 0, r = N - 1, m;
	while (l <= r) {
		m = l + (r - l) / 2;
		if (note[m] > num) r = m - 1;
		else if (note[m] < num) l = m + 1;
		else return true;
	}
	return false;
}

int main() {
	cin.tie(0)->sync_with_stdio(0);
	
	cin >> T;
	while (T--) {
		cin >> N;
		for (int i = 0; i < N; ++i) cin >> note[i];
		
		sort(begin(note), begin(note) + N);
		
		cin >> M; 
		for (int i = 0; i < M; ++i) {
			int num;
			cin >> num;
			cout << check(num) << '\n';
		}
	}
}

소스코드 링크

결과

profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

0개의 댓글