수 찾기

08 September 2019

문제 : https://www.acmicpc.net/problem/1920

배열을 정렬한 후 이분 탐색으로 값을 찾는 문제를 풀어보도록 하겠습니다.

#include<stdio.h>

void quickSort(int arr[], int low, int high);
int binarySearch(int* arr, int L, int R, int val);

int main(void) {

	int N;

	scanf("%d", &N);
	int* arr = new int[N];

	for (int i = 0; i < N; i++)
	{
		scanf("%d", &arr[i]);
	}

	quickSort(arr, 0, N - 1);

	int count, val;
	scanf("%d", &count);

	for (int i = 0; i < count; i++)
	{
		scanf("%d", &val);
		printf("%d\n", binarySearch(arr, 0, N - 1, val));
	}


	return 0;
}

int binarySearch(int* arr, int L, int R, int val) {

	if (R >= L)
	{
		int mid = L + (R - L) / 2;

		if (arr[mid] == val)
		{
			return 1;
		}

		if (arr[mid] > val)
		{
			return binarySearch(arr, L, mid - 1, val);
		}
		return binarySearch(arr, mid + 1, R, val);
	}
	return 0;
}

void swap(int* a, int* b)
{
	int t = *a;
	*a = *b;
	*b = t;
}

int partition(int arr[], int low, int high)
{
	int pivot = arr[high];
	int i = (low - 1);

	for (int j = low; j <= high - 1; j++)
	{
		if (arr[j] < pivot)
		{
			i++;
			swap(&arr[i], &arr[j]);
		}
	}
	swap(&arr[i + 1], &arr[high]);
	return (i + 1);
}

void quickSort(int arr[], int low, int high)
{
	if (low < high)
	{

		int pi = partition(arr, low, high);

		quickSort(arr, low, pi - 1);
		quickSort(arr, pi + 1, high);
	}
}
이분 탐색으로 값을 찾는 문제를 풀어보도록 하겠습니다.
우선 받은 값을 arr에 저장 후, quickSort로 배열을 정렬해주도록 합니다.
이에 이분 탐색으로 해당 값이 있는지 찾아주도록 합니다.