Cospro 2급/C언어

[1차]문제4. 등장하는 구장 많은 수와 적은 수 구하기 풀이 및 해석

SRin23 2021. 5. 3. 22:49

■ 문제 설명

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

→ 1단계. 배열에 들어있는 각 자연수의 개수를 셉니다. 

→ 2단계. 가장 많이 등장하는 수의 개수를 구합니다.

→ 3단계. 가장 적게 등장하는 수의 개수를 구합니다.

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

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

 

■ 매개변수 설명

자연수가 들어있는 배열 arr와 arr의 길이 arrlen이 solution함수의 매개변수로 주어집니다

→ arrlen은 3이상 1000이하의 자연수 입니다.

→ arr에는 1이상 1000이하의 자연수가 들어있습니다.

 

■ return값 설명

배열에서 가장 많이 등장하는 숫자가 가장 적게 등장하는 숫자보다 몇 배 이상 많은지 return해주세요.

→ 가장 많이 들어있는 수의 개수와 가장 적게 들어있는 수의 개수가 같은 경우에는 1을 return합니다.

 

■ 예시

arr arr_len return
[1, 2, 3, 3, 1, 3, 3, 2, 3, 2] 10 2

 

■ 예시 설명

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

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

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

3이 1보다 2.5배 더 많이 들었으며, 소수부분을 버리고 2를 return하면 됩니다.

 

■ 초기 내용

[출처]goormedu COSPRO 2급 기출문제 1차-4번 초기내용

 

위 내용을 바탕으로 우리는 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;
    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, 1001);
    int min_cnt = func_c(counter, 1001);
    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);
}

 

■ 답안 풀이 및 해석

(※ 실행흐름순으로 해석됩니다.)

 

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);
}

//배열 arr의 값을 계산할것이다.

//배열 arr의 길이 arr_len은 10이다.

//변수 ret는 solution의 return값을 갖는다.

 

int solution(int arr[], int arr_len) {
    int* counter = func_a(arr, arr_len);
    int max_cnt = func_b(counter, 1001);
    int min_cnt = func_c(counter, 1001);
    return max_cnt / min_cnt;
}

//counter 포인터 변수에 func_a의 return값을 저장

//max_cnt 정수형 변수에 func_b의 return값을 저장

//min_cnt 정수형 변수에 func_c의 return값을 저장

//max_cnt/min_cnt값을 return하여 main함수의 ret 변수에 저장

 

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;
}

//malloc 동적 할당 변수를 이용하여 counter 포인터 변수에 1001개의 방 생성

//counter 전체 0으로 초기화

//counter 인덱스 중 arr에 포함된 값 인덱스의 내용 +1

//ex. arr[0] = 1 이면, counter[1]++

//ex2. arr[9] = 3이면, counter[3]++

 

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;
}

//넘어온 counter와 counter의 길이로 counter중 가장 큰 값 찾아서 return

 

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;
}

//넘어온 counter와 counter의 길이로 counter중 가장 작은 값 찾아서 return

 

■ 실행 결과

문제 4. 등장하는 가장 많은 수와 적은 수 구하기

 

https://edu.goorm.io/learn/lecture/16921/cos-pro-2%25EA%25B8%2589-%25EA%25B8%25B0%25EC%25B6%259C%25EB%25AC%25B8%25EC%25A0%259C-c%25EC%2596%25B8%25EC%2596%25B4

 

COS PRO 2급 기출문제 - C언어 - 구름EDU

YBM IT에서 시행하는 COS Pro 자격증 기출문제를 직접 풀어볼 수 있는 실습 위주의 강좌입니다.

edu.goorm.io