티스토리 뷰
문제
자연수가 들어있는 배열이 있습니다. 이 배열에서 가장 많이 등장하는 숫자의 개수는 가장 적게 등장하는 숫자 개수의 몇 배인지 구하려 합니다. 이를 위해 다음과 같이 간단한 프로그램 구조를 작성했습니다.
- 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 | 출력한 후 프로그램을 종료한다. |
'[코테] > [GroomEdu]' 카테고리의 다른 글
[COS PRO 2급] 5번_배열의 순서 뒤집기 (C/C++) (0) | 2021.05.05 |
---|---|
[COS PRO 2급] 6번_369게임 박수의 개수는? (C/C++) (1) | 2021.05.05 |
[COS PRO 2급] 3번_시작 날짜와 끝 날짜의 사이 구하기 (C/C++) (0) | 2021.05.03 |
[COS PRO 2급] 2번_백화점 등급별 할인적용 (C/C++) (0) | 2021.05.02 |
[COS PRO 2급] 1번_단체 티셔츠 주문하기 (C/C++) (0) | 2021.05.02 |
댓글
공지사항
최근에 올라온 글
TAG
- lv2
- 알고리즘
- C
- c언어
- Java
- 자바
- Cos Pro
- 연습문제
- 코스프로
- 배열
- lv1
- 배열활용문제
- 구름에듀 기출문제
- 1급
- CosPro
- groomedu
- groom
- cospro기출
- 기출문제
- programmers
- 프로그래머스
- 구름에듀
- COSPRO 2급
- YBM
- 코딩테스트
- C++
- 구름 기출문제
- c언어 기출문제
- cospro기출문제
- YBM기출
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함