티스토리 뷰
문제
왼손 장갑의 제품 번호가 들어있는 배열과 오른손 장갑의 제품 번호가 들어있는 배열이 있습니다.
제품 번호는 1부터 10 사이의 자연수입니다.
제품 번호가 같은 왼손장갑과 오른손 장갑을 합쳐 한 쌍을 만들 수 있습니다.
이떄, 최대한 많은 쌍의 장갑을 만들면 최대 몇 쌍을 만들 수 있는지 구하려 합니다.
이를 위해 다음과 같이 프로그램 구조를 작성했습니다.
- 왼손 장갑이 제품 번호별로 몇 개씩 있는지 개수를 셉니다.
- 오른손 장갑이 제품 번호별로 몇 개씩 있는지 개수를 셉니다.
- 각 제품 번호별로 최대한 많은 장갑 쌍을 만들면서 개수를 셉니다.
왼손 장갑의 제품 번호가 들어있는 배열 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 |
goorm
구름은 클라우드 기술을 이용하여 누구나 코딩을 배우고, 실력을 평가하고, 소프트웨어를 개발할 수 있는 클라우드 소프트웨어 생태계입니다.
www.goorm.io
'[코테] > [GroomEdu]' 카테고리의 다른 글
[COS PRO 2급] 2차 3번_짝수들의 제곱의 합 구하기 (C/C++) (0) | 2021.05.09 |
---|---|
[COS PRO 2급] 2차 2번_더 많은 배수 구하기 (C/C++) (0) | 2021.05.08 |
[COS PRO 2급] 10번_평균 이하의 개수 구하기 (C/C++) (0) | 2021.05.07 |
[COS PRO 2급] 9번_중복문자 삭제하기 (C/C++) (0) | 2021.05.07 |
[COS PRO 2급] 8번_펠린드롬 확인하기 (C/C++) (0) | 2021.05.06 |
댓글
공지사항
최근에 올라온 글
TAG
- 구름에듀 기출문제
- cospro기출
- 구름 기출문제
- YBM
- groomedu
- cospro기출문제
- CosPro
- Java
- 코딩테스트
- YBM기출
- 기출문제
- COSPRO 2급
- C
- 알고리즘
- C++
- lv1
- 연습문제
- c언어
- Cos Pro
- programmers
- lv2
- 구름에듀
- 배열활용문제
- c언어 기출문제
- 1급
- 코스프로
- groom
- 배열
- 프로그래머스
- 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함