LIS 시간초과 도저히 모르겠어요ㅠ 멘붕

  • foreverikazi
    foreverikazi

    LIS 문제를 풀기 위해 LOWER BOUND를 사용하였구요.
    이진검색 함수를 사용해서 logn의 탐색을 보장 받았습니다.
    배열의 크기만큼 arr_max를 채우고 있기 때문에 최종적으로
    nlogn의 시간복잡도를 갖는다고 생각하는데도 불구하고 시간초과가 나옵니다. ㅠ
    어디서 시간을 잡아먹고 있는지 전혀 알수가 없습니다.
    고수님들 조언 좀 부탁드립니다.

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cmath>
    using namespace std;
    //LIS
    const int MAX_LENGTH = 500;
    int arr_max[MAX_LENGTH];
    int result[MAX_LENGTH];
    
    int binarySearch(int first, int last, int value)
    {
        if (first > last)
            return 0;
    
        int mid = (first + last) / 2;
    
        if (arr_max[mid-1] < value && arr_max[mid] > value)
            return mid;
    
        else if (arr_max[mid - 1] > value)
            return binarySearch(0, mid, value);
    
        else 
            return binarySearch(mid + 1, last, value);
    }
    
    int calculate_maxSize(int arr[], int length)
    {
        int index = 0;
        int size = 0;
        arr_max[index] = arr[0];
        for (int i = 1; i < length; i++)
        {
            if (arr_max[index] < arr[i])
                arr_max[++index] = arr[i];
    
            else
            {
                int temp = binarySearch(0, index, arr[i]);
                arr_max[temp] = arr[i];
            }
        }
    
        while (arr_max[size] != 0)
            size++;
    
        return size;
    }
    
    int main()
    {
        int caseNum;
        int arrSize = 0;
        int arr[MAX_LENGTH];
    
        cin >> caseNum;
        for (int i = 0; i < caseNum; i++)
        {
            memset(arr_max, 0, sizeof(int)*arrSize);
            cin >> arrSize;
    
            for (int j = 0; j < arrSize; j++)
                cin >> arr[j];
    
            cout << calculate_maxSize(arr, arrSize) << endl;
        }
        return 0;
    }
    }
    


    9년 전
1개의 댓글이 있습니다.
  • koosaga
    koosaga

    대충 봐서 잘은 모르겠지만 binary search 부분이 의심이 가네요.

    • 기저조건 first > last가 프로그램을 끝내기 충분한지
    • mid = 0인 경우가 있는지 (a[mid - 1] 접근)

    부분 검토를 추천드립니다.


    9년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.