본문 바로가기

c언어 스터디/HackerRank

[HackerRank] Search- Missing Numbers

Missing Numbers | HackerRank

 

Missing Numbers | HackerRank

Find the numbers missing from a sequence given a permutation of the original sequence

www.hackerrank.com

 

<문제>

input: 총 네 줄의 입력을 받는다. 첫번째 줄에는 첫번째 리스트의 크기를 입력받고, 두번째 줄에는 그 리스트의 원소들을 차례로 입력받는다.
세번째 줄에는 두번째 리스트의 크기를 입력받고, 네번째 줄에는 두번째 리스트의 원소를 입력받는다.
output: 두 리스트 중 한쪽에는 없는 missing numbers를 출력한다.

 

<코드>

int* missingNumbers(int arr_count, int* arr, int brr_count, int* brr, int* result_count) {
    int numbers[10001];
    int * missing,p = -1;
    
    missing = malloc(sizeof(int) * 100);
    memset(numbers,0,sizeof(numbers));
    
    for(int i = 0;i < brr_count ;i++) numbers[ brr[i] ]++;
    
    for(int i = 0;i < arr_count ;i++) numbers[ arr[i] ]--;

    for(int i = 0 ; i < 10001 ; i++)
    {
        if( numbers[ i ] > 0 )
        {
            p++;
            missing[p] =  i;
        }
        
    }
    *result_count = p+1;
    return missing;

}

<풀이>

먼저 숫자들을 저장하기 위해 numbers[] 배열을 선언하였다. 그리고 두번째 리스트에서의 frequency를 계산하기 위해 for문을 사용하여 brr[i]의 값을 numbers[]의 인덱스로 하고 1씩 증가시켰다. 다음으로는 첫번째 리스트에서 두번째 리스트와 겹치면 그 값은 지우기 위해 numbers[arr[i]]--를 하였다. 마지막으로, numbers[] 배열의 전체 범위를 for문을 통해 살펴보면서 0보다 크면 p값을 하나 증가시키고, missing[p]값에 i값을 입력했다.
missing 포인터를 리턴하여 문제를 풀 수 있었다.

 

 

<실행결과>