C# 프로그래밍 기초 실습 전자책

C# / .NET 알고리즘과 퀴즈
본 알고리즘 퀴즈 문제는 C#/.NET 개발자를 위한 알고리즘 인터뷰 혹은 C# 프로그래밍을 통한
문제 해결 알고리즘을 연구해 보는데 도움이 되고자 작성되었습니다.


퀴즈 질문


예상답변/설명

정렬된 배열인 경우 Binary Search를 통해 O(log N)의 속도 신속하게 검색할 수 있다. 이 문제는 그러나 시작 위치가 배열내 임의의 위치에 있다라고 했으므로, 이진 검색 방식을 약간 변형해야 한다. 즉, 이진 검색에서 중간값보다 클 때, 마지막 오른쪽 바운더리 값과 다시 비교하여 해당 k값이 오른쪽 범위에 존재하는지 다시 체크해야 한다. 왜냐하면 큰 값이 왼쪽에 있을 수 있기 때문이다. 이러한 방식으로 중간값보다 작은 경우도 다시 왼쪽 바운더리를 체크한다. 이렇게 추가적인 바운더리 체크가 있다 하더라도, 이진 검색 방식으로 중간 값을 계속 체크한다는 점은 동일하다.

public void RunTest()
{
    int[] A = { 17, 19, 21, 4, 8, 10, 11 };
    int index = SearchInArray(A, 0, A.Length - 1, 19);
    Console.WriteLine(index);
}

public int SearchInArray(int[] A, int left, int right, int k)
{
    if (left > right)
        return -1;

    int mid = (left + right) / 2;
    if (k == A[mid])
        return mid;
            
    if (k > A[mid])
    {
        if (k <= A[right])
            left = mid + 1;
        else
            right = mid - 1;
    }
    else // k < A[mid]
    {
        if (k >= A[left])
            right = mid - 1;
        else
            left = mid + 1;
    }
    return SearchInArray(A, left, right, k);
}