본문 바로가기

cospro2급/cospro_1차

2021-05-03

cospro 2급 4번 문제

등장하는 가장 많은 수와 적은 수 구하기

 

문제설명 

자연수가 들어있는 배열에서 가장 많이 등장하는 숫자의 개수는 가장 적게 등장하는 개수의 몇 배인지 구한다.

 

1단계 : 배열에 들어있는 각 자연수의 개수를 센다.

2단계 : 가장 많이 등장하는 수의 개수를 구한다.

3단계 : 가장 적게 등장하는 수의 개수를 구한다.

4단계 : 가장 많이 등장하는 수가 가장 적게 등장하는 수보다 몇 배 더 많은지 구한다.

 

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

자연수가 들어있는 배열 arr과 arr의 길이 arr_len이 매개변수로 주어질 때, 가장 많이 등장하는 숫자가 가장 적게

등장하는 숫자보다 몇 배 더 많은지 return하는 solution함수를 완성한다.

 

매개변수설명

자연수가 들어있는 배열 arr과 arr의 길이 arr_len이 solution함수의 매개변수로 주어진다. 

*arr_len은 3이상 1000 이하의 자연수이다. *arr에는 1이상 1000 이하의 자연수가 들어있다.

 

return 값 설명

배열에서 가장 많이 등장하는 숫자가 가장 적게 등장하는 숫자보다 몇배 더 많은 지 return 한다. 

이때 가장 많이 등장하는 수의 개수와 가장 적게 등장하는 수의 개수가 같은 경우에는 1을 return 한다.

 

예시설명

배열에는 1이 2개, 2가 3개, 3이 5개 들어있다.

가장 적게 들어있는 숫자 : 1(2개)

가장 많이 들어있는 숫자 : 3(5개)

 

3이 1보다 2.5배 많으며, 소수 부분은 버리고 2를 return 한다.

 

로직설명

solution함수는 배열에 들어있는 자연수의 개수, 가장 많은 자연수의 개수, 가장 적은 자연수의 개수를 구한 후 가장 많은 자연수의 개수와 가장 적은 자연수의 개수를 나눈 값을 return한다.

 

자연수이 개수를 구하는 함수는 func_a함수이다.

func_a함수는 자연수가 들어있는 배열 arr[]과 배열의 길이인 arr_len를 받는다. counter배열을 동적할당으로 선언한 뒤 0으로 초기화한다. 만약 자연수가 들어있는 배열의 값이 1이면 counter의 1번방을 누적한다.  이와 같은 원리로 배열의 값이 든 방 번호가 i라면 conter는 배열의 i번방의 갯수를 누적한다.

 

가장 많은 자연수의 개수를 구하는 함수는 func_b이다.

func_b함수는 func_a함수를 통해 받은 포인터 counter와 배열의 길이인 arr_len을 받는다. counter를 받는 이유는 func_a함수를 통해 자연수의 개수를 구했기 때문이다. 이제 가장 많은 자연수를 개수를 구한다. 배열에 들어있는 값 중 가장 작은 값보다 작은 값을 선언해준 뒤 선언한 변수가 배열에 들어있는 값보다 크면 변수에 그 값을 넣어준다. 즉 갯수가 많은 값이 변수에 들어가게 된다. 

 

func_c함수는 마찬가지로 counter와 arr_len을 받는다. 변수를 선언할 때 *arr의 크기는 1000이하의 자연수이니 그 수보다 큰 값으로 초기화한다. 배열이 0이 아니거나 배열의 값이 변수보다 작으면 변수에는 배열의 값이 들어간다. 즉, 갯수가 적은 값이 변수에 들어가게 된다. 0이 아닌 경우를 조건에 넣는 이유는 func_a함수에서 counter배열을 0으로 초기화 했기 때문이다. 0은 계산할 필요가 없기 때문에 제외하고 계산한다.

 

main()함수에서는 배열에 자연수를 넣어주고 그 배열의 길이를 선언한다. solution함수를 불러 문제에 맞는 값을 구한다.

 

코드설명

#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; //배열의 값을 0으로 초기화
    for(int i = 0; i < arr_len; i++)
        counter[arr[i]]++; //arr의 값에 따라 counter의 방번호를 누적한다. 자연수를 개수를 구하는 것이다.
    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);
}

'cospro2급 > cospro_1차' 카테고리의 다른 글

2021-05-05  (0) 2021.05.05
2021-05-05  (0) 2021.05.05
2021-05-03  (0) 2021.05.03
2021-05-02  (0) 2021.05.02
2021-05-02  (0) 2021.05.02