문자열이 주어지면 문제는 해당 문자열에서 가장 자주 나타나는 알파벳을 반환하는 것입니다.
1. 얼마나 많은 알파벳이 등장했는지 알아야 하므로 알파벳이 몇 번 등장했는지를 저장하는 배열을 만들어야 합니다.
2. 등장알파벳의 개수를 배열로 저장하면 가장 많이 등장하는 알파벳이 1개 이상인지 판단하여 답을 반환한다.
#include <bits/stdc++.h>
using namespace std;
int alpha(26);
char ans=" ";
void Solve () {
string s;
cin >> s;
int l = s.length ();
for ( int i = 0 ; i < l ; i ++ ) {
alpha( s( i ) % 32 - 1 ) ++;
/*
* alphabet의 대소문자 여부와 상관없이 같은 alphabet이라면 같은 index값을 갖게 합니다.
* alphabet 대문자의 ASCII코드는 65 ~ 90 이고, 소문자는 97 ~ 122 인데
* 65 = 32 * 2 + 1이고, 97 = 32 * 3 + 1이기 때문에 32로 나머지 연산을 했을 때의 값이 같아서 가능합니다.
*/
}
int mx = *max_element (alpha , alpha + 26); // mx : 가장 많이 등장한 alphabet의 등장 횟수
/*
* 여기서 max_element 함수는 alpha(0)에서 부터 alpha(25)까지의 값 중 max값의 주소를 반환합니다.
* 앞에 *를 붙임으로써 max값의 주소가 아닌 max값을 가져올 수 있습니다.
*/
for ( int i = 0 ; i < 26 ; i ++ ) {
if ( alpha( i ) == mx ) { // 가장 많이 등장한 alphabet만 걸러주는 if문
if (ans == ' ') {
/*
* 가장 많이 등장한 alphabet을 찾았고, ans가 초기값이라면,
* ans에 현재 alphabet을 저장해줍니다.
*/
ans = i + 65; // 인덱스에 +65(ASCII)를 해줌으로써 대문자 alphabet으로 변환
}
else {
/*
* 가장 많이 등장한 alphabet을 찾았는데 ans가 초기값이 아니라면,
* 가장 많이 등장한 alphabet이 한 개가 아니라는 뜻이므로 ans에 '?'를 저장해주고 break 합니다.
*/
ans="?";
break;
}
}
}
cout << ans;
}
int main () {
ios_base::sync_with_stdio (false);
cin.tie (nullptr);
Solve ();
return 0;
}