Codility - MaxCounters

2020. 3. 9. 22:15codility

문제)

설명

N = 리턴할 배열의 크기

A[] = 문제의 배열 요소

M = A[] 배열의 크기

 

A[] 의 배열 요소의 값에 따라 N크기의 배열의 값 증가.

단, A[]의 배열 요소 중 N값 보다 큰 값이 있을 경우 A[]의 배열 요소중 가장 큰 값으로 초기화.

 

예시

N = 5, M = 7, A[]의 요소는 아래와 같을 때.

    A[M]                        Arr[N]

A[0] = 3                    {0, 0, 1, 0, 0}

A[1] = 4                    {0, 0, 1, 1, 0}

A[2] = 4                    {0, 0, 1, 2, 0}

A[3] = 6                    {2, 2, 2, 2, 2}  <<-- N(5) 보다 큰 값이 있을 땐 Arr[] 배열 요소 중 가장 큰 값으로 초기화

A[4] = 1                    {3, 2, 2, 2, 2}

A[5] = 4                    {3, 2, 2, 3, 2}

A[6] = 4                    {3, 2, 2, 4, 2}

 

리턴 값은 {3, 2, 2, 4, 2} 가 저장된 배열 주소 값.

 

시간 복잡도는 O(N + M)을 넘지 않아야 합니다. 즉 2중 for문은 사용 X!!!

 

해당 배열 요소의 증가 값중 가장 많이 증가한 값을 저장해야 하고,

배열 요소중 N보다 큰 값이 있을 경우 가장 많이 증가된 값으로 초기화.

다시 카운트..... 

 

소스 코드

#include <stdlib.h>
 
void arrInput(int * arr, int num, int len);
 
struct Results solution(int N, int A[], int M) {
    struct Results result;
    int i, count = 0, max = 0, index = 0, flag = 0;
    int *arr = (int *)malloc(sizeof(int) * N);
 
    result.L = N;
    arrInput(arr, 0, N);
 
    for (i = 0; i < M; i++) {     //여기 for문은 max 값과 index 값을 구하기 위한 부분
 
        if (A[i] > N) {
            max = count;
            index = i;
            flag = 1;
            continue;
        }
 
        if (flag == 1 && arr[A[i] - 1] < max)
            arr[A[i] - 1] = max;
 
        arr[A[i] - 1]++;
 
        if (arr[A[i] - 1] > count)
            count = arr[A[i] - 1];
    }
 
    if (flag == 0)
        result.C = arr;
    else {
        arrInput(arr, max, N);               //max 값과 index 값을 대입하여 배열을 마무리
        for (i = index + 1; i < M; i++)      //남은 요소 값들 증가
            arr[A[i] - 1]++;
 
        result.C = arr;
    }
 
    return result;
}
 
void arrInput(int * arr, int num, int len) {
    int i;
 
    for (i = 0; i < len; i++)
        arr[i] = num;
}

처음엔 2중 for문으로 간단히 작성했지만 77점이 나와 다르게 생각하느라 좀 시간이 걸렸던 것 같습니다.

처음 시작되는 for문은 max 값과 index 값을 구하는 구간 입니다.

N보다 큰 값이 중간 중간 5개 이상 있다고 가정을 하고 N값이 클 때마다 max 값을 업데이트 시켰습니다.

하지만 초기화가 되면 (만약 {0, 1, 4, 4, 2} 가 있고 N보다 큰 값을 만나 {4, 4, 4, 4, 4}로 됬을 경우)

0 값이 4가 되버리니깐 이상황에서 카운터를 다시 세야 했습니다.  때문에 if문을 둬서 max 값보다 arr[] 배열 요소 값이

작으면 max 값으로 초기화를 하고 카운터를 셌습니다.

index 값은 배열 요소 중 마지막으로 큰 값이 나온 index값을 구하기 위해 코드에 넣었고.

index값 이후로는 전혀 큰 값이 나오지 않은 것임으로

index 값을 기준으로 max값으로 배열을 초기화 시키고 나머지 배열 요소들을 증가시켜 마무리 지었습니다.

사실 이걸 말로 설명하려고 하니 어렵내요 참...... 코드를 봐도 잘 짠 코드 같지 않아보이고......

실력이 참 많이 부족한 것 같습니다.....

'codility' 카테고리의 다른 글

codility - OddOcurrenceInArray  (0) 2020.03.10
codility - BinaryGap  (0) 2020.03.10
codility - CyclicRotation  (0) 2020.03.10
Codility - FrogJmp  (0) 2020.03.10
Codility - Permutation check  (0) 2020.03.10