알파벳의 count배열을 만들고 최대 개수와 최대 개수인 알파벳을 갱신하는 방식으로 접근하였다.
#include <iostream>
using namespace std;
int main ()
{
int asc[1000]={0}, mx=0, eqn=0; // asc는 ascii코드의 count배열,
// mx은 최대 개수, eqn은 동일 개수 확인 토글 변수
string str;
char mxc; // mxc는 최대 개수일 때의 char 값
cin >> str;
for (int a:str){
if (a>96) a-=32; // 소문자일 경우 대문자로 변환
asc[a]++; // 개수를 하나 늘리기
if (mx < asc[a]){ // 최대 개수 갱신 시
mx=asc[a]; // 최대 개수와 그때의 char 저장
mxc=char(a);
eqn=0; // 최대 개수 갱신되어
// 같은 경우를 나타내는 eqn을 false로 저장
}
else if (mx == asc[a]) eqn=1; //개수가 늘었는데 기존 최대값과 같을 시
// eqn을 true로 저장
}
cout << (eqn?'?':mxc); // 삼항연산자로 출력
}
#import<iostream>
int a[26],c=26,d,e; // a는 알파벳의 count 배열로 보인다.
char b;
main(){
while(std::cin>>b) // string 자료형으로 받지 않고 char 자료형으로 한 문자씩 입력을 받았다.
a[b>96?b-97:b-65]++; // 96은 대문자 Z의 아스키코드 번호로 96보다 크면 소문자를 의미한다.
// 즉 소문자이면 'a'에 해당하는 97을 빼서 0번~25번 인덱스의 숫자를 하나 늘리고,
// 아니면 'A'에 해당하는 65를 빼서 0번 ~ 25번 인덱스의 숫자를 늘린다.
for(;c--;) // 26개의 알파벳 개수인 c를 줄이며 0일 때까지 순회
// 배열 a를 끝에서 부터 확인하면서 comma(',') 연산자를 통해
// a[c]>d가 true인 경우 d에 최대값을 저장하고, e에는 그때의 문자를 저장한다.
// false인 경우 다시 삼항 연산자를 통해
// a[c]-d가 0 인 경우, 즉 a[c]=d인 같은 경우 e에 -2를 할당하여
// ?의 아스키 코드 값 63을 만든다.
a[c]>d?d=a[c],e=c:a[c]-d?0:e=-2;
std::cout<<char(e+65);
}