본문 바로가기
코딩 테스트/[c언어] cos pro 2급 기출문제

[No.11] 최대한 많은 쌍의 장갑 개수 구하기 / cos pro 2급 c언어 기출 문제

by M개발자 2021. 5. 8.
반응형

최대한 많은 쌍의 장갑 개수 구하기


문제 설명

 

왼손 장갑의 제품 번호가 들어있는 배열과 오른손 장갑의 제품 번호가 들어있는 배열이 있습니다. 

제품 번호는 1 ~ 10 사이의 자연수입니다.

제품 번호가 같은 왼손 장갑과 오른손 장갑을 합쳐 장갑 한 쌍을 만들 수 있습니다. 

 

1. 왼손 장갑이 제품 번호별로 몇 개씩 있는지 개수를 셉니다.

2. 오른손 장갑이 제품 번호별로 몇 개씩 있는지 개수를 셉니다.

3. 각 제품 번호별로 최대한 많은 장갑 쌍을 만들면서 개수를 셉니다.

 

왼손 장갑의 제품 번호가 들어있는 배열 left_gloves와 left_gloves의 길이 left_gloves_len, 오른손 장갑의 제품 번호가 들어있는 배열 right_gloves와 right_gloves의길이 right_gloves_len이 매개변수로 주어질 때, 최대한 몇개의 장갑 쌍을 만들 수 있는지 return하도록 solution 함수를 작성하려고 합니다. 이때, 위 구조를 참고하여 중복되는 부분은 func_a라는 함수를 작성했습니다. 코드가 올바르게 동작할 수 있도록 빈칸을 채워주세요.

 


예시

 

left_gloves left_gloves_len right_gloves right_gloves_len return
[2, 1, 2, 2, 4] 5 [1, 2, 2, 4, 4, 7] 6 4

코드 해석

 

for문 1) 0 ~ max_product_number까지 : gloves의 원소는 1 ~ 10이하의 자연수라는 조건 때문에 10까지 돌린다.

동적 할당된 배열의 값을 초기화해주는 for문

 

for문 2) 0 ~ gloves_len - 1 까지 반복하고, counter[gloves[i]] 방을 1 더한다.

 

left_gloves가 매개변수일 경우

2 1 2 2 4
counter[2]++ counter[1]++ counter[2]++ counter[2]++ counter[4]++

counter 배열은 [0, 1, 3, 0, 1, 0, 0, 0, 0, 0, 0]가 된다. 

 

right_gloves가 매개변수일 경우

1 2 2 4 4 7
counter[1]++ counter[2]++ counter[2]++ counter[4]++ counter[4]++ counter[7]++

counter 배열은 [0, 1, 2, 0, 2, 0, 0, 1, 0, 0, 0]가 된다. 

int* func_a(int gloves[], int gloves_len) {
    int* counter = (int*)malloc(sizeof(int) * (max_product_number + 1));
    for (int i = 0; i <= max_product_number; ++i)
        counter[i] = 0;

    for (int i = 0; i < gloves_len; ++i)
    	counter[gloves[i]]++;

    return counter;
}

 

1행 : left_counter

2행 : right_counter

3행 mini함수의 return 값 

1 3 0 1 0 0 0 0 0 0
1 2 0 2 0 0 1 0 0 0
1 2 0 1 0 0 0 0 0 0

total = 1 + 2 + 1  = 4

int mini(int a, int b) {
    return a < b ? a : b;
}

.
.
.

int solution(int left_gloves[], int left_gloves_len, int right_gloves[], int right_gloves_len) {
    int* left_counter = func_a(left_gloves, left_gloves_len);
    int* right_counter = func_a(right_gloves, right_gloves_len);
    int total = 0;
    for (int i = 1; i <= max_product_number; ++i)
        total += mini(left_counter[i], right_counter[i]);
    return total;
}

 


전체 코드 

더보기

 

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

const int max_product_number = 10;
int* func_a(int gloves[], int gloves_len) {
    int* counter = (int*)malloc(sizeof(int) * (max_product_number + 1));
    for (int i = 0; i <= max_product_number; ++i)
        counter[i] = 0;

    for (int i = 0; i < gloves_len; ++i)
        counter[i]++;

    return counter;
}
int mini(int a, int b) {
    return a < b ? a : b;
}

int solution(int left_gloves[], int left_gloves_len, int right_gloves[], int right_gloves_len) {
    int* left_counter = func_a(left_gloves, left_gloves_len);
    int* right_counter = func_a(right_gloves, right_gloves_len);
    int total = 0;
    for (int i = 1; i <= max_product_number; ++i)
        total += mini(left_counter[i], right_counter[i]);
    return total;
}

int main() {
    int left_gloves[5] = { 2, 1, 2, 2, 4 };
    int left_gloves_len = 5;
    int right_gloves[6] = { 1, 2, 2, 4, 4, 7 };
    int right_gloves_len = 6;
    int ret = solution(left_gloves, left_gloves_len, right_gloves, right_gloves_len);

    printf("The return value of solution function is %d \n", ret);
}

cos pro 2급 기출문제

github

반응형

댓글