Mentoring

[멘토링][c언어] 백준 1157번 : 단어 공부 (포인터 사용)

seomj 2020. 6. 4. 16:21

#include <stdio.h>
#include <string.h>

int main() {
   char arr[1000001];
   int a[26] = { 0, };
   char *p = arr;
   int *q = a;
   int  max = 0, num = 0, n = 0, len = 0;

   scanf("%s", arr);
   len = strlen(arr);

   for (int i = 0; i < len; i++) {
      if (p[i] >= 97) {
         p[i] = p[i] - 32;
      }
      q[p[i] - 65]++;
   }
   max = a[0];
   for (int i = 1; i < 26; i++) {
      if (max < q[i]) {
         max = q[i];
         num = i;
      }
   }
   for (int i = 0; i < 26; i++) {
      if (max == q[i]) {
         n++;
      }
   }
   if (n > 1) {
      printf("?");
   }
   else {
      printf("%c ", num + 65);
   }
   return 0;
}

입력받을 문자열을 배열 arr에 저장할 것이므로 arr 배열을 선언한다.

배열 a를 선언하여 이것은 알파벳 갯수를 저장시켜줄 것이다.

포인터 변수들과 사용할 변수들을 선언한다.

 

첫 for문을 사용하여 문자열의 길이만큼 반복을 시킬 것이다. 각각의 문자열들이 97을 넘으면 소문자이므로 32를 빼주어 대문자로 저장을 시켜준다. 대문자로 바꾼다음엔 65를 빼서 0~25 숫자로 바꾸어 해당하는 자리에 값을 더해준다.

 

다음 for문에서는 빈도가 많은 알파벳은 배열 a에서 숫자가 클 것이므로 max 변수를 사용하여 가장 큰 숫자를 구해준다. 그리고 num 값에 몇번째인지를 저장해준다. 그래야 그게 무슨 알파벳인지 구할 수 있다.

알파벳의 빈도수가 중복될 수 있는데 이 경우에는 get이라는 변수에 -1을 넣어서 이 단어가 중복되는지 안되는지 구분해준다.

 

그 다음 if문에서 get이 -1 값을 가지지 않을 경우 num에 65를 더해서 대문자로 바꾼 후 출력을 시키고 get이 -1의 값을 가질 경우에는 ?를 출력한다.