백준[baekjoon]/C언어

백준(baekjoon) [C] - 2776번: 암기왕

_KTH_ 2023. 2. 5. 18:34
728x90

 

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

 

2776번: 암기왕

연종이는 엄청난 기억력을 가지고 있다. 그래서 하루 동안 본 정수들을 모두 기억 할 수 있다. 하지만 이를 믿을 수 없는 동규는 그의 기억력을 시험해 보기로 한다. 동규는 연종을 따라 다니며,

www.acmicpc.net


#include <stdio.h>  // 암기왕
#include <stdlib.h>

int n, m;
int arr[1000001];
int sort[1000001];

void merge(int* arr, int start, int mid, int end)
{
	int i, j, k;
	i = start;
	j = mid + 1;
	k = start;

	while (i <= mid && j <= end)
	{
		if (arr[i] >= arr[j])
			sort[k++] = arr[j++];
		else
			sort[k++] = arr[i++];
	}

	if (i > mid)
	{
		for (int idx = j; idx <= end; idx++)
		{
			sort[k++] = arr[idx];
		}
	}
	else
	{
		for (int idx = i; idx <= mid; idx++)
		{
			sort[k++] = arr[idx];
		}
	}

	for (int idx = start; idx <= end; idx++)
	{
		arr[idx] = sort[idx];
	}
}

void merge_sort(int* arr, int start, int end)
{
	int mid;
	if (start < end)
	{
		mid = (start + end) / 2;
		merge_sort(arr, start, mid);
		merge_sort(arr, mid + 1, end);
		merge(arr, start, mid, end);
	}
}

int binary_search(int* arr, int num)
{
	int left = 0;
	int right = n;
	int mid;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (arr[mid] == num)
			return 1;
		else if (arr[mid] > num)
			right = mid - 1;
		else
			left = mid + 1;
	}
	return 0;
}


int main()
{
	int t;
	scanf("%d", &t);

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

		merge_sort(arr, 0, n);

		scanf("%d", &m);
		int num;
		for (int j = 0; j < m; j++)
		{
			scanf("%d", &num);
			printf("%d\n", binary_search(arr, num));
		}

		for (int j = 0; j < n; j++)
		{
			arr[j] = 0;
		}
	}

	return 0;
}

MEMO

-- 정렬 + 이진탐색 구현만 가능하다면 해결가능

-- 동적할당으로 arr, sort를 할당했다가 메모리초과로 실패

-- 전역변수에 1차원 배열을 만들어서 해결 

 

!! 이진탐색, 병합정렬 생각하지 않고도 코드를 짤 수 있을 때까지 익히기 !!

728x90
728x90