반응형

#문제1 왼손 장갑의 제품 번호가 들어있는 배열과 오른손 장갑의 제품 번호가 들어있는 배열이 있습니다. 제품 번호는 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의 길이 left_gloves_len, 오른손 장갑의 제품 번호가 들어있는 배열 right_gloves와 right_gloves의 길이 right_gloves_len이 solution 함수의 매개변수로 주어집니다.

  • left_gloves_len은 1 이상 100 이하의 자연수입니다.
  • left_gloves의 원소는 1 이상 10 이하의 자연수입니다.
  • right_gloves_len은 1 이상 100 이하의 자연수입니다.
  • right_gloves의 원소는 1 이상 10 이하의 자연수입니다.

return 값 설명

왼손과 오른손의 제품 번호가 같은 장갑 끼리 한 쌍을 만들 때, 최대 몇 개의 쌍을 만들 수 있는지 개수를 return 해주세요.


예시

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

예시 설명

예시 #1 왼손 장갑 : 1번 장갑 1개, 2번 장갑 3개, 4번 장갑 1개가 있습니다. 오른손 장갑 : 1번 장갑 1개, 2번 장갑 2개, 4번 장갑 2개, 7번 장갑 1개가 있습니다.

따라서 1번 장갑 한 쌍, 2번 장갑 두 쌍, 4번 장갑 한 쌍을 만들면 최대 4개의 장갑 쌍을 만들 수 있습니다.

문제

#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)
        @@@
    
    return counter;
}

int min(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 += min(left_counter[i], right_counter[i]);
    return total;
}

// 아래는 테스트케이스 출력을 해보기 위한 main 함수입니다.
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("solution 함수의 반환 값은 %d 입니다.\\n", ret);
}

정답

#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[gloves[i]]++;
    
    return counter;
}

int min(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 += min(left_counter[i], right_counter[i]);
    return total;
}

반응형