티스토리 뷰
□문제 설명
다양한 색을 가진 양말 중 같은 색을 가진 양말을 2개씩 묶어 한 쌍을 만드려고 합니다.
예를 들어, 가지고 있는 양말의 색깔이 [빨강, 파랑, 빨강, 노랑, 파랑, 빨강] 이라면 아래 그림과 같이 2쌍을 만들 수 있습니다.
양말 색을 숫자로 표현해서 담은 배열 socks, socks의 길이 socks_len이 매개변수로 주어질 때, 양말을 몇 쌍 만들 수 있는지 return하도록 solution함수를 작성했습니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서 한 줄만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.
□매개변수 설명
양말 색을 숫자로 표현해서 담은 배열 socks, socks의 길이 socks_len이 매개변수로 주어집니다.
- 양말 색은 0 보다 크거나 같고 10 보다 작은 정수로 표현합니다.
- socks_len은 1 이상 100 이하입니다.
□예시
socks | socks_len | return |
[1,2,1,3,2,1] | 6 | 2 |
□주어진 코드
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(int socks[], int socks_len) {
int answer = 0;
int *count = (int *) malloc(sizeof(int) * 10);
memset(count, 0, sizeof(int) * 10);
for(int i = 0; i < socks_len; i++)
count[i]++;
for(int i = 0; i < 10; i++)
answer += (count[i] % 2);
return answer;
}
int main() {
int socks[] = {1, 2, 1, 3, 2, 1};
int socks_len = 6;
int ret = solution(socks, socks_len);
printf("solution 함수의 반환 값은 %d 입니다.\n", ret);
}
□결과 (비정상)
socks | socks_len | return |
[1,2,1,3,2,1] | 6 | 6 |
□코드 오류
주어진 코드대로 for(int i = 0; i < socks_len; i++) count[i]++;를 진행하면,
count의 각 방에 1이 저장되는 것 이외에는 의미가 없다.
즉, 문제에서 원하는 로직은 count방에 각 색깔의 수를 구하는 것이기 때문에,
색깔의 코드가 들어있는 socks배열의 값을 이용하여
count[socks[i]]++를 진행하면 된다.
예를 들어, 2번 색깔의 양말은 count[2]번방에 들어가서 2번색깔의 양말 수에 1개가 추가된다.
이때 주의할 것은, 색깔별로 방에 넣기 때문에 count[socks[i]-1]로 코드를 작성할 수 있으나,
매개변수에서 양말 색은 0부터 시작하므로, 인덱스 값을 따질 필요 없이 count[socks[i]]로 진행한다.
□완성 코드
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(int socks[], int socks_len) {
int answer = 0;
int *count = (int *) malloc(sizeof(int) * 10);
memset(count, 0, sizeof(int) * 10);
for(int i = 0; i < socks_len; i++)
count[socks[i]]++;
for(int i = 0; i < 10; i++)
answer += (count[i] / 2); //문제는 한줄 수정이 원칙이지만, 나는 해당 줄도 수정하였다
return answer;
}
int main() {
int socks[] = {1, 2, 1, 3, 2, 1};
int socks_len = 6;
int ret = solution(socks, socks_len);
printf("solution 함수의 반환 값은 %d 입니다.\n", ret);
}
□코드 분석
단계 | 과정 |
main | 양말 색을 숫자로 표현해서 담은 배열 socks와 그 길이를 선언한다. solution함수를 호출한다. |
solution | 만들어진 양말의 짝이 몇 쌍인지 갯수를 셀 변수 answer를 선언한다. 색깔별로 각 양말의 갯수를 세기 위한 배열 count를 malloc를 이용하여 동적으로 방 크기를 잡고, memset함수를 이용하여 모든 방을 0으로 초기화한다. |
solution - for | 양말의 갯수만큼 반복한다. count의 socks[i]방을 ++한다. 예를 들어, socks[i]의 값이 3이면, count배열의 3번방에 +1를 진행함으로서 3색깔이 한개 존재한다는 것을 나타낸다. |
solution - for | 색깔의 종류가 10가지이므로, for문을 10번 반복한다. answer에 각 count배열의 값을 2로 나눈 값을 누적합한다. 이 과정을 통해 몇개의 짝이 만들어지는지 알 수 있다. |
solution | answer를 return한다. |
main | 결과값(answer) ret를 출력한 후 프로그램을 종료한다. |
COS PRO 2급 기출문제 - C언어 - 구름EDU
YBM IT에서 시행하는 COS Pro 자격증 기출문제를 직접 풀어볼 수 있는 실습 위주의 강좌입니다.
edu.goorm.io
'[코테] > [GroomEdu]' 카테고리의 다른 글
[재업][COS PRO 2급] 2차 10번_상품권 총 지급액 구하기 (C/C++) (0) | 2021.05.29 |
---|---|
[COS PRO 2급] 6차 10번_사과 박스 무게의 불량 검사 (C/C++) (0) | 2021.05.29 |
[COS PRO 2급] 6차 8번_주어진 수와 뒤집은 수의 차 구하기 (C/C++) (0) | 2021.05.29 |
[COS PRO 2급] 6차 7번_의자와 책상을 사고싶어요 (C/C++) (0) | 2021.05.29 |
[COS PRO 2급] 6차 6번_비밀번호는 만드는것 보다 검사하는게 힘들죠 (C/C++) (0) | 2021.05.29 |
댓글
공지사항
최근에 올라온 글
TAG
- 구름 기출문제
- 코스프로
- 배열활용문제
- 알고리즘
- 배열
- 코딩테스트
- Java
- COSPRO 2급
- 프로그래머스
- c언어 기출문제
- groomedu
- cospro기출문제
- YBM기출
- CosPro
- Cos Pro
- 자바
- C
- groom
- 기출문제
- c언어
- cospro기출
- 구름에듀
- programmers
- YBM
- 연습문제
- lv2
- 구름에듀 기출문제
- 1급
- C++
- lv1
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함