Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어로 문자열에서 가장 적게 등장하는 문자 찾기

문자(character)들이 모여 이루어진 배열을 문자열(string)이라고 부릅니다. C 언어에서 문자열은 항상 널 문자('\0')로 끝나는 것이 특징입니다.

문자열 선언

문자열(문자 배열)은 다음과 같은 형식으로 선언합니다.

char stringname[size];

예를 들어 아래처럼 선언하면 최대 50글자를 저장할 수 있는 문자열이 됩니다.

char string[50];

문자열 초기화

문자열을 초기화하는 방법은 두 가지가 있습니다.

  • 문자 상수를 이용하는 방법
char string[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };
  • 문자열 상수를 이용하는 방법
char string[10] = "Hello";

문자열 접근

서식 지정자 "%s"를 사용하면 널 문자('\0')를 만날 때까지 문자열 전체를 입력받거나 출력할 수 있습니다.

최소 발생 문자를 찾는 로직

문자열에서 가장 적게 등장하는 문자를 찾으려면 먼저 각 문자의 출현 횟수를 저장할 빈도 배열을 준비하고, 이후 배열을 순회하며 최솟값을 갱신하는 방식을 사용합니다.

for(i=0; i<CHARS; i++){
   if(frequency[i]!=0){
      if(frequency[minimum] == 0 || frequency[i]<frequency[minimum])
         minimum = i;
   }
}

C 프로그램 전체 코드

다음은 문자열에서 가장 적게 등장하는 문자를 찾는 C 프로그램입니다.

#include <stdio.h>
#define SIZE 100  // 최대 문자열 크기
#define CHARS 255 // 처리 가능한 최대 문자 수

int main(){
    char string[SIZE];
    int frequency[CHARS];
    int i = 0, minimum;
    int value;

    printf("문자열을 입력하세요:\n");
    gets(string);

    // 모든 문자의 빈도를 0으로 초기화
    for(i=0; i<CHARS; i++){
        frequency[i] = 0;
    }

    // 각 문자의 빈도 계산
    i = 0;
    while(string[i] != '\0'){
        value = (int)string[i];
        frequency[value] += 1;
        i++;
    }

    // 최소 빈도를 가진 문자 찾기
    minimum = 0;
    for(i=0; i<CHARS; i++){
        if(frequency[i] != 0){
            if(frequency[minimum] == 0 || frequency[i] < frequency[minimum])
                minimum = i;
        }
    }

    printf("가장 적게 등장하는 문자는 '%c'이며 %d번 나타납니다.\n", minimum, frequency[minimum]);
    return 0;
}

참고: 원본 코드에는 변수 이름 오타(fequency → frequency)와 중괄호 누락이 있었는데, 위 코드에서는 이를 바로잡아 정상적으로 동작하도록 수정했습니다. 또한 gets() 함수는 버퍼 오버플로우 위험 때문에 표준에서 제외되었으므로, 실제 프로젝트에서는 fgets() 사용을 권장합니다.

실행 결과

위 프로그램을 컴파일하여 실행하면 다음과 같은 결과가 출력됩니다.

문자열을 입력하세요:
tutorialspoint
가장 적게 등장하는 문자는 'a'이며 1번 나타납니다.

동작 원리 정리

  1. 크기 255의 정수형 빈도 배열을 만들고 모든 요소를 0으로 초기화합니다.
  2. 문자열을 한 글자씩 순회하며, 각 문자의 아스키(ASCII) 코드 값을 인덱스로 사용해 해당 위치의 빈도를 1씩 증가시킵니다.
  3. 빈도 배열을 처음부터 끝까지 검사하면서, 실제로 등장한 문자(빈도가 0이 아닌 문자) 중 가장 작은 빈도를 가진 인덱스를 찾습니다.
  4. 찾은 인덱스를 문자(%c)로, 그리고 그 빈도를 숫자(%d)로 출력하면 결과를 확인할 수 있습니다.