[Codility] Lesson4 : MaxCounters

풀이

Respectable난이도로 표기된 문제만 올릴예정.

이 문제는 단순히 연산대로 풀이하면 O(N*M)이 되어 시간초과가 난다.

시간복잡도를 줄이는게 관건.

N+1연산이 나올시 lastMax에 당시 Max값을 임시저장한다음 값이 갱신되거나 마지막에 업데이트를 하는 방식으로

O(M+N)으로 시간복잡도를 줄일 수 있었다.

코드

MaxCounters

int arr[100001];

vector<int> solution(int N, vector<int> &A) {
    vector<int> result;
    //N+1이 나올때 lastmax에 logging하는것으로 시간복잡도 해결.
    int lastMax=0;
    int max=0;
    int size=A.size();
    for(int i=0;i<size;i++){
        if(A[i]==(N+1)){
            lastMax=max;
        }else{
            if(arr[A[i]] < lastMax){
                arr[A[i]] = lastMax;
            }
            arr[A[i]]++;
            if(arr[A[i]] > max){
                max = arr[A[i]];
            }
        }
    }
    //result벡터로 정답을 옮겨주며, 갱신안된 숫자들은 lastMax로 아직 변경안되었으므로 해당작업 수행
    for(int i=1;i<=N;i++){
        if(arr[i] < lastMax){
            result.push_back(lastMax);
        }else{
            result.push_back(arr[i]);
        }
    }
    return result;
}
Written on August 3, 2020