728x90
데이터가 정렬된 상태에서 데이터의 크기를 절반씩 줄이면서 대상을 찾는 알고리즘
중앙값을 비교하여 절반씩 줄여가므로 시간복잡도는 O(logN) 이 필요하다.

위와 같은 배열이 있을때 35를 찾아야한다고 가정해보자
앞에서부터 순차적으로 탐색하게될시 6번의 탐색 과정이 필요하다.
이진탐색 과정을 살펴보자

① 중간값 15 보다 크므로 오른쪽을 다음 탐색범위로 지정
② 중간값 23 보다 크므로 오른쪽을 다음 탐색범위로 지정
③ 중간값 35 로 탐색대상 확인
문제
https://www.acmicpc.net/problem/1920
1920번: 수 찾기
첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들
www.acmicpc.net
풀이
using System.Text;
StringBuilder sb = new StringBuilder();
int count = int.Parse(Console.ReadLine());
long[] nums = Array.ConvertAll(Console.ReadLine().Split(' '),long.Parse);
Array.Sort(nums);
int searchCount = int.Parse(Console.ReadLine());
long[] searchNums = Array.ConvertAll(Console.ReadLine().Split(' '),long.Parse);
for (int i = 0; i < searchCount; i++)
{
BinarySearch(searchNums[i]);
}
System.Console.WriteLine(sb.ToString());
void BinarySearch(long target)
{
int start = 0;
int end = count-1;
while (true)
{
int mid = (start + end) / 2;
if(nums[mid] == target)
{
sb.AppendLine("1");
break;
}
if(start >= end)
{
sb.AppendLine("0");
break;
}
if(nums[mid] < target)
start = mid+1;
else if(nums[mid] > target)
end = mid-1;
}
}
잘못된부분이나 개선될수있는 부분은 댓글 남겨주시면 감사합니다.
'알고리즘 > 탐색' 카테고리의 다른 글
브루트포스 알고리즘 - Brute Force (0) | 2024.11.10 |
---|---|
이진트리 전위 , 중위 , 후위 순회 (2) | 2024.03.06 |
백트레킹? BackTracking (2) | 2024.02.28 |