알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
예제 입력 1 예제 출력 1
Mississipi ?
예제 입력 2 예제 출력 2
zZa Z
예제 입력 3 예제 출력 3
z Z
예제 입력 4 예제 출력 4
baaa A
#include <stdio.h>
#include <string.h>
#include <limits.h>
// 1 인풋 입력
// 2 문자열을 돌아가며 문자의 갯수를 알아간다
// 3 반복할 때마다 max보다 크다면 해당 문자를 max로 할당
int main(){
char apb[1000001];
int count[123] = { 0, };
int max = INT_MIN;
int maxApb, div=0, length;
scanf("%s", apb);
length = strlen(apb);
for (int i = 0; i < length; i++)
{
for (int j = 65; j < 91; j++)
{
if(j == apb [i])
{
count[j]++;
}
}
for (int j = 97; j < 123; j++)
{
if(j == apb [i])
{
count[j - 32]++;
}
}
}
for (int i = 65; i < 91; i++)
{
if(count[i] > max)
{
max = count[i];
maxApb = i;
}
}
for (int i = 65; i < 91; i++)
{
if(max == count[i])
{
div++;
}
}
if(div > 1){
printf("?");
}
else
{
printf("%c", maxApb);
}
return 0;
}
모든 출력을 대문자로 하면 된다. 즉 소문자로 입력이 들어오면 소문자 아스키 코드 - 32를 하면 대문자 아스키 코드 값이 나오기 때문에 소문자를 대문자로 변환하면 된다.
두 개의 for를 만들어서 한 개는 소문자 아스키 값을 구하고, 또 하나는 대문자 입력값을 위한 for문을 만든다. 중요한 점은 소문자를 위한 for은 count배열을 카운팅할 때 -32를 해줘서 카운팅 한다. 그렇게 한다면 대문자 아스키 코드 값이 카운팅 되기 때문.
예를 들어 AaB를 입력한다면 A는 count배열의 65번째의 값이 ++이 되고, 그 다음 소문자 a는 원래라면 97번째 값이 카운팅 되어야 하지만 -32를 해줬기 때문에 65번째의 값이 카운팅 된다.
그렇게 한 뒤 for문에서 i값을 65부터 시작하고 90번째까지 돌리며 if문에서 count의 값 중 제일 큰 값을 가진 배열의 위치를 알아내고 max에 할당한다. 그리고 알파벳은 i와 같기에,
i를 maxApb에 할당한다.
그 다음 for은 같은 동일한 값의 max가 있으면 필터링 해주기 위한 for이다.
조건이 성립된다면 div를 ++해주고 div가 1보다 크다면 ?를 출력해주고,
아니라면 maxApb에 입력된 정수를 c로 문자로 출력해준다.