[1차]문제4. 등장하는 구장 많은 수와 적은 수 구하기 풀이 및 해석
■ 문제 설명
자연수가 들어있는 배열이 있습니다. 이 배열에서 가장 많이 등장하는 숫자의 개수는 가장 적게 등장하는 숫자 개수의 몇 배인지 구하려 합니다. 이를 위해 다음과 같이 간단히 프로그램 구조를 작성했습니다.
→ 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하면 됩니다.
■ 초기 내용
위 내용을 바탕으로 우리는 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
■ 실행 결과
COS PRO 2급 기출문제 - C언어 - 구름EDU
YBM IT에서 시행하는 COS Pro 자격증 기출문제를 직접 풀어볼 수 있는 실습 위주의 강좌입니다.
edu.goorm.io