본문 바로가기

algorithm/BOJ

백준 1920_수 찾기(C++)

 

www.acmicpc.net/problem/1920

 

1920번: 수 찾기

첫째 줄에 자연수 N(1≤N≤100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1≤M≤100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안��

www.acmicpc.net

[문제 풀이]

이분 탐색을 이용하여 풀었습니다.

 

이 문제의 경우 정렬이 되어있지 않으면 완전 탐색을 이용해야 합니다. 하지만 완전 탐색을 이용한다면 시간 초과가 날 것이라 생각하였기 때문에 정렬을 해주고 이분 탐색을 이용하여 문제를 풀어주었습니다.

 

아래 링크를 들어가시면 이분 탐색에 대한 자세한 내용을 정리해 두었습니다. 

 

 

steady-life.tistory.com/57?category=788590

 

이분 탐색

이분 탐색 이분 탐색은 탐색 기법의 하나입니다. 탐색 범위를 두 부분으로 분할 하며 탐색한다 하여 이분 탐색이라고 이름 지어졌습니다. 이분 탐색의 핵심은 왼쪽 경계, 오른쪽 경계, 가운데를

steady-life.tistory.com

[코드]

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

using namespace std;

int N, M;

vector<int> A;
vector<int> B;

int main() {

	scanf("%d", &N);

	for (int i = 0; i < N; i++) {
		int temp;
		scanf("%d", &temp);

		A.push_back(temp);
	}

	scanf("%d", &M);

	for (int i = 0; i < M; i++) {
		int temp;
		scanf("%d", &temp);

		B.push_back(temp);
	}

	sort(A.begin(), A.end());

	for (int i = 0; i < M; i++) {
		
		bool check = false;

		int left = 0;
		int right = N - 1;
		int target = B[i];

		while (left <= right) {

			int mid = (left + right) / 2;

			if (A[mid] > target) {
				right = mid - 1;
			}
			else if (A[mid] < target) {
				left = mid + 1;
			}
			else if (A[mid] == target) {
				check = true;
				break;
			}
		}

		if (check)
			printf("1\n");
		else
			printf("0\n");

	}

	return 0;

}

 

 

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

백준 3055_탈출(C++)  (0) 2020.09.28
백준 1713_후보 추천하기(C++)  (0) 2020.09.24
백준 10942_팰린드롬?(C++)  (0) 2020.06.28
백준 14889_랜선 자르기(C++)  (0) 2020.06.07
백준 5557_1학년(C++)  (0) 2020.06.04