본문 바로가기
C Programming/연습 문제

[C언어 연습문제]강좌 13. Digit Frequency(숫자 빈도수 구하기)

by 희품 2019. 3. 29.
반응형

학습(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를 이용해 한 번 저장해주고, 접근하였습니다.

 

사실 알고리즘 차원에서는 답안 코드와 다른 점은 없네요.

 

아스키코드에 대한 지식과 배열, 반복문에 대한 지식이 필요한 문제였어요.

 

반응형