본문 바로가기
Algorithm/BOJ

[BOJ]10815번: 숫자 카드 (c++)

by HBGB 2020. 7. 7.

https://www.acmicpc.net/problem/10815

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

 

이분탐색

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool binary_search(vector<int>& cards, int left, int right, int target)
{
	// 찾는 값이 없는 경우
	if (left > right)
	{
		return false;
	}

	int mid = (left + right) / 2;
	int mid_val = cards[mid];

	// 값을 찾으면
	if (mid_val == target)
	{
		return true;
	}
	// 중간 값이 target보다 작으면 : [mid + 1, right]범위에서 재 탐색
	else if (mid_val < target)
	{
		return binary_search(cards, mid + 1, right, target);
	}
	// 중간 값이 target보다 크면 : [left, mid - 1]범위에서 재 탐색
	else 
	{
		return binary_search(cards, left, mid - 1, target);
	}
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	// 입력
	int N, M;
	cin >> N;
	vector<int> cards(N);
	for (int i = 0; i < N; ++i)
	{
		cin >> cards[i];
	}

	// 이분탐색을 위한 오름차순 정렬
	sort(cards.begin(), cards.end());

	cin >> M;
	for (int i = 0; i < M; ++i)
	{
		int test;
		cin >> test;
		// 각 테스트케이스들의 값이 cards에 있는지 이분탐색으로 확인
		cout << binary_search(cards, 0, N - 1, test) << ' ';
	}

	return 0;
}

 

 

 

숫자열을 주고, 각 테스트 케이스의 숫자가 주어진 배열에 포함되는지 확인하는 문제이다.

 

숫자 카드의 개수 N은 (1 ≤ N ≤ 500,000),

테스트 케이스의 개수 M은 (1 ≤ M ≤ 500,000) 의 범위를 가지기 때문에

단순 반복문으로 검색하면 최악의 경우 O(NM)로 시간제한에 걸린다. 

따라서 이분탐색을 통해 O(M * log N)으로 풀어야 한다.

 

 

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ]11728번: 배열 합치기 (c++)  (0) 2020.07.07
[BOJ]10816번: 숫자 카드 2 (c++)  (0) 2020.07.07
[BOJ]1790번: 수 이어 쓰기 2 (c++)  (0) 2020.07.07
[BOJ]1377번: 버블 소트 (c++)  (0) 2020.07.07
[BOJ]11652번: 카드 (c++)  (0) 2020.07.07

댓글