티스토리 뷰

 

문제

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

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

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

이떄, 최대한 많은 쌍의 장갑을 만들면 최대 몇 쌍을 만들 수 있는지 구하려 합니다.

이를 위해 다음과 같이 프로그램 구조를 작성했습니다.

 

  1.  왼손 장갑이 제품 번호별로 몇 개씩 있는지 개수를 셉니다.
  2.  오른손 장갑이 제품 번호별로 몇 개씩 있는지 개수를 셉니다.
  3.  각 제품 번호별로 최대한 많은 장갑 쌍을 만들면서 개수를 셉니다.

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

코드가 올바르게 동작할 수 있도록 빈칸을 알맞게 채워주세요.

 

 

 

 

 

 

 


 

 

코드

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

 

 

 

 


 

 

코드분석

단계 과정
main 왼쪽과 오른쪽 각각의 제품번호가 들어있는 배열을 정의하고 solution함수를 호출한다.
solution 왼쪽장갑의 제품번호 순서대로 그 개수를 정리한 배열을 얻기 위해 func_a함수를 호출한다.
이때, 매개변수로 left_gloves배열과 그 길이를 넘겨준다.
func_a malloc을 사용하여 counter배열의 크기를 동적으로 할당한다.
counter의 배열을 for문을 사용하여 초기화한다.

for문을 이용하여 counter의 장갑의 사이즈와 일치하는 방에 ++하게 되면,
counter배열 0번방에 사이즈 1, 1번방에 사이즈 2, 2번방에 사이즈 3,,,,,,과 같이 사이즈의 갯수를 저장할 수 있다.
각 사이즈별 개수를 구한 후 counter를 return한다.
solution / func_a 위 [solution, func_a]과 일치하는 과정으로 오른쪽 장갑의 제품번호 순서대로 그 개수가 들어있는 배열을 얻는다. 
solution 짝이 이루어지는 장갑들의 합을 구하기 위해 for문을 max_product_number까지 돌린다.
이때 왼쪽장갑의 수가 오른쪽장갑의 수보다 더 많을 때, 짝은 오른쪽 장갑의 수만큼 나온다.
(개수가 일치하지 않으면 짝이 이루어질 수 없음)
따라서 더 작은 쪽의 개수를 구하는 함수 min을 호출하고 그 값을 total에 계속해서 더한다.
main return받은 total값을 출력한 후 프로그램을 종료한다.

 

 

 

 

 

 

예시

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

 

 

 

 

 

 

 

 

 

GroomEdu

 

goorm

구름은 클라우드 기술을 이용하여 누구나 코딩을 배우고, 실력을 평가하고, 소프트웨어를 개발할 수 있는 클라우드 소프트웨어 생태계입니다.

www.goorm.io

 

댓글