학습(Study) & 목표(Objective) & 과제(Task)
주어진 문장 s는 알파벳과 숫자가 포함된 문장입니다. 주어진 문장 안에 각 숫자의 빈도수를 찾는 것이 목표입니다.
입력 형식(Input Format)
첫 번째 줄에 숫자가 포함된 문자열 num을 입력받습니다.
제약 조건(Constraints)
입력된 문자열 num은 1글자 이상이고, 1000글자 이하여야 합니다.
출력 형식(Output Format)
0에서 9까지의 각 숫자의 빈도수를 10개의 공백으로 구분하여, 한 줄에 표시합니다.
입력 예제(Sample Input) - 1
a11472o5t6
출력 예제(Sample Output) - 1
0 2 1 0 1 1 1 1 0 0
0, 3, 8, 9는 나오지 않았기 때문에 0이며, 1은 2번 나왔으므로, 2가 됩니다. 2는 1번, 4, 5, 6, 7은 1번씩 나와서 각 구분마다 1이 들어갔습니다.
입력 예제(Sample Input) - 2
lw4n88j12n1
출력 예제(Sample Output) - 2
0 2 1 0 1 0 0 0 2 0
입력 예제(Sample Input) - 3
1v88886l256338ar0ekk
출력 예제(Sample Output) - 3
1 1 1 2 0 1 2 0 5 0
주어진 코드
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
return 0;
}
답안 코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *s;
s = malloc(1024 * sizeof(char));
scanf("%s", s);
s = realloc(s, strlen(s) + 1);
int len = strlen(s), i;
int arr[10];
for(i = 0; i < 10; i++)
arr[i] = 0;
for(i = 0; i < len; i++) {
if(s[i] >= '0' && s[i] <= '9') {
arr[(int)(s[i] - '0')]++;
}
}
for(i = 0; i < 10; i++)
printf("%d ", arr[i]);
printf("\n");
free(s);
return 0;
}
동적으로 배열을 만들고, 초기화해주고 있네요. 문자열을 입력받았기 때문에, 표출되는 숫자는 숫자가 아닌 문자 '0' ~ '9'입니다. 0부터 9까지의 숫자 빈도수를 저장한 배열 arr의 인덱스를 s[i] - '0'로 주면서 빈도수를 더하고 있는데요, s[i] >= '0' && s[i] <= '9' 범위가 이미 설정되어 있어서 (s[i] - '0')은 0부터 9까지 수를 의미합니다.
따라서 '0'이 나오면 0 index에 1을 더하고, '9'가 나오면 9 index에 1을 더하면서 빈도수를 더하는 프로그램이죠.
추가 답안 코드
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int i = 0;
int arrNumCount[10] = {0};
char szBuffer[1024] = {0};
scanf("%s", szBuffer);
for(i = 0; i < strlen(szBuffer); i++)
{
if(szBuffer[i] >= '0' && szBuffer[i] <= '9')
{
int nIdx = (int)(szBuffer[i] - '0');
if(nIdx >= 0 && nIdx < 10)
arrNumCount[nIdx]++;
}
}
for(i = 0; i < 10; i++)
{
printf("%d ", arrNumCount[i]);
}
return 0;
}
좀 더 정리해봤습니다. 큰 프로그램이 아니기 때문에 가독성을 위해 배열로 선언했고, nIdx를 이용해 한 번 저장해주고, 접근하였습니다.
사실 알고리즘 차원에서는 답안 코드와 다른 점은 없네요.
아스키코드에 대한 지식과 배열, 반복문에 대한 지식이 필요한 문제였어요.
'C Programming > 연습 문제' 카테고리의 다른 글
[C언어 연습문제]강좌 15. Calculate the Nth term(재귀 함수를 활용한 조건 계산) (0) | 2019.04.09 |
---|---|
[C언어 연습문제]강좌 14. Dynamic Array in C(도서관 책장, 책 페이지 수 쿼리, 조회 프로그램) (0) | 2019.04.03 |
[C언어 연습문제]강좌 12. Printing Tokens(문자열 토큰을 사용한 출력) (0) | 2019.03.26 |
[C언어 연습문제]강좌 11. Array Reversal(배열 반전, 요소 뒤집어 출력) (0) | 2019.03.22 |
[C언어 연습문제]강좌 10. 1D Arrays in C(malloc - 동적 배열 만들기) (0) | 2019.03.20 |