C#의 Array.BinarySearch(Array, Object) 메서드는 정렬된 1차원 배열 전체에서 특정 요소를 검색하는 데 사용됩니다. 이 메서드는 배열의 각 요소와 검색 대상 개체가 구현하고 있는 IComparable 인터페이스를 기준으로 비교 연산을 수행합니다.
이진 탐색(Binary Search)은 배열이 오름차순으로 정렬되어 있어야만 올바른 결과를 보장합니다. 따라서 검색을 수행하기 전에 Array.Sort() 메서드로 배열을 미리 정렬해 두는 것이 좋습니다.
구문(Syntax)
public static int BinarySearch (Array arr, object val);
매개변수
- arr: 검색 대상이 되는 정렬된 1차원 배열입니다.
- val: 배열에서 찾고자 하는 개체(Object)입니다.
반환 값
- 요소를 성공적으로 찾으면 해당 요소의 인덱스(0부터 시작)를 반환합니다.
- 요소를 찾지 못하면 음수를 반환합니다. 반환값에 비트 NOT 연산(~)을 적용하면 해당 값이 삽입될 위치(다음으로 큰 요소의 인덱스)를 알 수 있습니다.
예제 1: 정수 배열에서 검색하기
using System;
public class Demo {
public static void Main() {
int[] intArr = {5, 10, 15, 20};
Array.Sort(intArr);
Console.WriteLine("배열 요소...");
foreach(int i in intArr) {
Console.WriteLine(i);
}
Console.Write("요소 20의 인덱스 = " + Array.BinarySearch(intArr, 20));
}
}
실행 결과
배열 요소... 5 10 15 20 요소 20의 인덱스 = 3
값 20은 정렬된 배열의 네 번째 위치에 있으므로 인덱스 3이 반환됩니다.
예제 2: 문자열 배열에서 검색하기
using System;
public class Demo {
public static void Main() {
string[] strArr = {"John", "Tim", "Fedric", "Gary", "Harry", "Damien"};
Array.Sort(strArr);
Console.WriteLine("배열 요소...");
foreach(string s in strArr) {
Console.WriteLine(s);
}
Console.Write("요소 Gary의 인덱스 = " + Array.BinarySearch(strArr, "Gary"));
Console.Write("\n요소 Tom의 인덱스 = " + Array.BinarySearch(strArr, "Tom"));
}
}
실행 결과
배열 요소... Damien Fedric Gary Harry John Tim 요소 Gary의 인덱스 = 2 요소 Tom의 인덱스 = -7
결과 분석
문자열 배열은 Array.Sort()에 의해 알파벳 순으로 정렬됩니다. "Gary"는 정렬된 배열의 세 번째 위치에 있으므로 인덱스 2가 반환됩니다.
반면 "Tom"은 배열에 존재하지 않기 때문에 음수인 -7이 반환됩니다. 배열의 길이가 6이므로 "Tom"이 삽입될 위치는 인덱스 6이며, 비트 보수 연산(~6 = -7)의 결과가 그대로 반환되는 것입니다. 이처럼 음수 반환값을 활용하면 요소가 없을 때의 삽입 위치까지 파악할 수 있습니다.