6차 문제 9
문제 설명
다양한 색을 가진 양말 중 같은 색을 가진 양말을 2개씩 묶어 한 쌍을 만드려고 합니다.
예를 들어, 가지고 있는 양말의 색깔이 [빨강, 파랑, 빨강, 노랑, 파랑, 빨강]이라면 아래 그림과 같이 2쌍을 만들 수 있습니다.
양말 색을 숫자로 표현해서 담은 배열 socks, socks의 길이 socks_len이 매개변수로 주어질 때, 양말을 몇 쌍 만들 수 있는지 return 하도록 solution 함수를 작성했습니다.
그러나, 코드 일부분이 잘못되어있기 때문에 올바르게 동작하지 않으므로 한 줄만 변경해서 올바르게 동작하도록 수정하세요.
예시
socks | socks_len | return |
[1, 2, 1, 3, 2, 1] | 6 | 2 |
수정해야 할 코드
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;
}
수정
answer += (count[i] % 2); → answer += (count[i] / 2); |
양말 2개에 한 짝을 이루므로 answer에는 count[i]가 2의 배수이고 배수마다 1을 증가시켜야 한다.
count[i]를 2로 나눈 나머지 값을 넣을 경우엔 구하고자 한 값과 일치하지 않은 값이 들어가게 된다.
i | 0 | 1 | 2 | 3 | 4 | ... |
count[i] | 0 | 3 | 2 | 1 | 0 | ... |
count[i] % 2 | 0 % 2 = 0 |
3 % 2 = 1 |
2 % 2 = 0 |
1 % 2 = 1 |
0 % 2 = 0 |
... |
count[1]일 때 한 켤레가 완성되므로 +1, count[2]일 때 한 켤레가 완성되므로 +1해서 총 2가 되어야 하지만
count[i] % 2를 할 경우 count[1] % 2의 나머지 값인 1, count[3] % 2의 나머지값인 1이 더해져 총 2가 된다.
구하고자 하는 방식과 다른 방식으로 계산되었고,
짝이 지어졌을 때가 아닌 짝을 짓고 남은 값이 더해지므로 정확하지 않은 결과가 나온다.
코드 해석 및 전체 코드
양말의 색은 10가지로 cout의 배열 길이를 10으로 잡는다.
첫 번째 for문에서는 socks_len만큼 반복하여
socks [i]의 원소의 count 배열 방을 1 증가시킨다.
i | 0 | 1 | 2 | 3 | 4 | 5 |
socks[i] | 1 | 2 | 1 | 3 | 2 | 1 |
count[i]++ | count[1]++ | count[2]++ | count[1]++ | count[2]++ | count[2]++ | count[1]++ |
count 배열은 [0, 3, 2, 1, 0, 0, 0, 0, 0, 0]이다.
두 번째 for문은 짝이 있는 양말의 개수를 구하기 위해 양말 종류의 개수인 10만큼 반복한다.
양말은 2개가 한 켤레를 이루므로 count[i]를 2로 나눈 값을 answer에 더한다.
i | 0 | 1 | 2 | 3 | 4 | ... |
count[i] | 0 | 3 | 2 | 1 | 0 | ... |
count[i] / 2 | 0 / 2 = 0 |
3 / 2 = 1 |
2 / 2 = 1 |
1 / 2 = 0 |
0 / 2 = 0 |
... |
count[1]이 3이므로 양말 한 켤레가 완성되고, count[2]이 2이므로 양말 한 켤레가 완성되어
총 answer는 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[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);
}
구름 goormedu COS PRO 2급 기출문제 - C언어
'코딩 테스트 > [c언어] cos pro 2급 기출문제' 카테고리의 다른 글
[No.60] 6차 문제 10 / cos pro 2급 c언어 기출 문제 (0) | 2021.05.30 |
---|---|
[No.58] 6차 문제 8 / cos pro 2급 c언어 기출 문제 (0) | 2021.05.30 |
[No.57] 6차 문제 7 / cos pro 2급 c언어 기출 문제 (0) | 2021.05.30 |
[No.56] 6차 문제 6 / cos pro 2급 c언어 기출 문제 (0) | 2021.05.30 |
[No.55] 6차 문제 5 / cos pro 2급 c언어 기출 문제 (0) | 2021.05.30 |
댓글