오랜만에 C언어로 문제를 풀어서 그런지 언어 사용하는 것에 익숙해지는데 시간이 꽤 오래 걸렸다. 아래는 문제를 해결하는 과정에서 어려움을 겪었던 문법들이다.
문제 해결의 단계는 아래와 같다.
realloc()으로 재할당을 시도했다.toupper(); 함수를 사용한다. <ctype.h>를 include 해야한다.#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
int main() {
int size = 10;
int count = 0;
char string[26] = { 0 }; // 알파벳 26개를 카운트하기 위한 배열
char* word = (char*)malloc(size * sizeof(char));
int max = 0;
int index = 0;
int check = 0;
for (int i = 0;; i++) {
if (count == size) {
size *= 2;
word = realloc(word, size * sizeof(char));
}
scanf("%c", &word[i]);
count++;
if (word[i] == '\n') {
word[i] = '\0'; // 문자열의 끝을 표시
break;
}
}
for (int i = 0; i < count; i++) {
word[i] = toupper(word[i]);
if (word[i] >= 'A' && word[i] <= 'Z') {
string[word[i] - 'A']++;
}
}
for (int i = 0; i < 26; i++) {
if (string[i] > 0 && string[i] > max) {
max = string[i];
index = i;
}
}
for (int i = 0; i < 26; i++) {
if (string[i] > 0 && string[i] == max) {
check++;
}
if (check >= 2) {
printf("?");
return;
}
}
printf("%c", index + 'A');
free(word); // 동적 메모리 해제
return 0;
}
이 부분에서 문제가 된 점은
string배열을char타입으로 설정한 것이다.string배열은 각 알파벳의 갯수를 카운트하기 위한 배열이므로int타입으로 수정하고 난 후 해결되었다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h> // 이게 머지?
int main() { // 런타임 에러
int size = 10;
int count = 0;
int string[26] = { 0 }; // 알파벳 26개를 카운트하기 위한 배열
char* word = (char*)malloc(size * sizeof(char));
int max = 0;
int index = 0;
int check = 0;
for (int i = 0;; i++) {
if (count == size) {
size *= 2;
word = realloc(word, size * sizeof(char));
}
scanf("%c", &word[i]);
count++;
if (word[i] == '\n') {
word[i] = '\0'; // 문자열의 끝을 표시
break;
}
}
for (int i = 0; i < count; i++) {
word[i] = toupper(word[i]);
if (word[i] >= 'A' && word[i] <= 'Z') {
string[word[i] - 'A']++;
}
}
for (int i = 0; i < 26; i++) {
if (string[i] > 0 && string[i] > max) {
max = string[i];
index = i;
}
}
for (int i = 0; i < 26; i++) {
if (string[i] > 0 && string[i] == max) {
check++;
}
if (check >= 2) {
printf("?");
return;
}
}
printf("%c", index + 'A');
free(word); // 동적 메모리 해제
return 0;
}
string배열의 타입을int로 수정하고 난 후에는 런타임 에러가 발생하였다. 여러 문제점을 찾아보았다.
\n문제\n을 사용할 이유가 없다. 단어는 공백이 없고, scanf 함수는 공백이 입력되면 자동으로 입력이 끝났다고 처리하기 때문이다.이러한 문제점들을 개선하여 제출한 답은 아래와 같다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h> // toupper 사용 위함
#include <string.h> // strlen 사용 위함
int main() {
char word[1000000];
scanf("%s", word);
int len = strlen(word);
int string[26] = {0}; // 26개 알파벳
int max=0;
int count = 0;
int index;
for (int i = 0; i < len; i++) {
word[i] = toupper(word[i]);
string[word[i] - 'A']++;
}
for (int i = 0; i < 26; i++) {
if (string[i] > 0 && max < string[i]) {
max = string[i];
index = i;
}
}
for (int i = 0; i < 26; i++) {
if (max == string[i])
count++;
}
if (count > 1) {
printf("?");
}
else {
printf("%c", 'A' + index);
}
}