Codility 4-4 MaxCounters

Codility 4-4 MaxCounters

For example, given integer N = 5 and array A such that:

    A[0] = 3   
    A[1] = 4    
    A[2] = 4    
    A[3] = 6    
    A[4] = 1    
    A[5] = 4    
    A[6] = 4

the values of the counters after each consecutive operation will be:

    (0, 0, 1, 0, 0)    
    (0, 0, 1, 1, 0)    
    (0, 0, 1, 2, 0)    
    (2, 2, 2, 2, 2)    
    (3, 2, 2, 2, 2)    
    (3, 2, 2, 3, 2)    
    (3, 2, 2, 4, 2)

The goal is to calculate the value of every counter after all operations.

시간복잡도 때문에 77% 에서 100% 최초에 짰을때는 문제그대로 시뮬레이션 해서 1~N 까지의 값일땐 해당 인덱스의 값을 ++ 해주고 N+1 일때 모든 인덱스의 값을 max값으로 채워줬음. 이때 모든 인덱스의 값을 채워주는 과정에서 시간이 N만큼 들어서 시간 복잡도가 A.length * N 되어버림.

그래서 min 값을 따로 두고 해당 인덱스의 값이 min 보다 크거나 같을경우 ++ , min 보다 작을경우 min+1 으로 대입해줌 이렇게 해주면 N+1 을 만날때마다 모든 인덱스의 값을 채우는 비효율을 개선할 수 있음.

public static int[] solution(int N, int[] A) {
    // write your code in Java SE 
    int[] ans = new int[N];
    int max = 0;
    int min = 0;
    for(int i = 0; i < A.length; i++) {
        if(A[i] == N+1) {
            min = max;
        }
         
        else {
            if(min <= ans[A[i]-1])
                ans[A[i]-1]++;
            else {
                ans[A[i]-1] = min+1;
            }
             
            if(ans[A[i]-1] > max)
                max = ans[A[i]-1];
        }
    }
     
    for(int i = 0; i < N; i++) {
        if(ans[i] < min)
            ans[i] = min;
    }
     
    return ans;
}