티스토리 뷰

 

문제

자연수가 들어있는 배열이 있습니다. 이 배열에서 가장 많이 등장하는 숫자의 개수는 가장 적게 등장하는 숫자 개수의 몇 배인지 구하려 합니다. 이를 위해 다음과 같이 간단한 프로그램 구조를 작성했습니다.

  • 1단계. 배열에 들어있는 각 자연수의 개수를 셉니다.
  • 2단계. 가장 많이 등장하는 수의 개수를 구합니다.
  • 3단계. 가장 적게 등장하는 수의 개수를 구합니다.
  • 4단계. 가장 많이 등장하는 수가 가장 적게 등장하는 수보다 몇 배 더 많은지 구합니다.

단, 몇 배 더 많은지 구할 때는 소수 부분은 버리고 점수 부분만 구하면 됩니다.

자연수가 들어있는 배열 arr와 arr의 길이 arrlen이 매개변수로 주어질 때, 가장 많이 등장하는 숫자가 가장 적게 등장하는 숫자보다 몇 배 더 많은지 return하도록 solution함수를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸에 주어진 func_a, func_b, func_c함수와 매개변수를 알맞게 채워주세요.

 

 

 

 

 

 

 

 


 

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int* func_a(int arr[], int arr_len){
    int* counter = (int*)malloc(sizeof(int)*1001);
    for(int i = 0; i < 1001; i++)
        counter[i] = 0;
    for(int i = 0; i < arr_len; i++)
        counter[arr[i]]++;						// ㄱ
    return counter;
}

int func_b(int arr[], int arr_len) {
    int ret = 0;
    for(int i = 0; i < arr_len; i++){
        if(ret < arr[i])
            ret = arr[i];
    }
    return ret;
}

int func_c(int arr[], int arr_len){
    const int INF = 1001;
    int ret = INF;
    for(int i = 0; i < arr_len; i++){
        if(arr[i] != 0 && ret > arr[i])
            ret = arr[i];
    }
    return ret;
}
int solution(int arr[], int arr_len) {
    int* counter = func_a(arr,arr_len);
    int max_cnt = func_b(counter,arr_len);
    int min_cnt = func_c(counter,arr_len);
    return max_cnt / min_cnt;
}
int main() {
    int arr[10] = {1, 2, 3, 3, 1, 3, 3, 2, 3, 2};
    int arr_len = 10;
    int ret = solution(arr, arr_len);

    printf("solution 함수의 반환 값은 %d 입니다.\n", ret);
}

 


코드해석

단계 과정
main arr에 자연수가 들어있고, 이 배열에서 가장 많이 등장하는 수와 적은 수를 찾게 된다.
계산처리를 위해 배열과 배열의 길이를 solution함수에 넘긴다.
solution 포인터 변수 counter를 선언한 후 func_a를 호출한다. counter는 각 자연수의 개수를 세는 배열이다.
func_a malloc를 사용하여 counter배열을 선언하고, 첫번째 for문으로 초기화시킨다.
ㄱ부분을 통해 arr배열의 (각 숫자-1)에 해당하는 count배열의 방에 +1한다. (3 -> 2번방 ++)
solution return값 counter배열을 포인터변수 counter에 할당한다. (배열연결)
가장 많이 등장하는 수를 찾기 위해 func_b함수를 호출한다.
func_b 가장 많이 등장하는 수를 넣을 변수 ret를 선언한다.
배열의 길이만큼 for문을 돌리면서 저장된 횟수가 ret보다 클때마다 ret의 값을 변경함으로써 최빈값을 구한다.
solution return값 ret를  max_cnt에 저장한다.
가장 적게 등장하는 수를 찾기 위해 func_c함수를 호출한다.
func_c 가장 적게 등장하는 수를 넣을 변수 ret를 선언한다. (이때 ret는 최대값+1인 1001로 초기화한다.)
arr배열의 값이 0이 아니고, ret보다 작을때마다 ret의 값을 변경함으로써 가장 적게나온 수를 구한다.
solution return값 ret를 min_cnt에 저장한다.
max_cnt - min_cnt를 return한다.
main 출력한 후 프로그램을 종료한다.

 

댓글