내가 작성한 코드
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int howMany(string s, char c) {
int count = 0;
for (char a : s) {
if (c == a)
++count;
}
return count;
}
int main() {
string k;
cin >> k;
transform(k.begin(), k.end(), k.begin(), ::toupper);
int ret = 0;
int max = 0;
char maxc = '\0';
int check = 0;
for (char i = 'A'; i <= 'Z'; ++i) {
ret = howMany(k, i);
if (max <= ret) {
if (max == ret) {
check = 1;
} else {
check = 0;
}
max = ret;
maxc = i;
}
}
if (check == 1) {
cout << '?' << endl;
} else {
cout << maxc << endl;
}
return 0;
}
- 배열 26칸을 만들어 각 배열마다 문자의 개수를 저장하여 비교하려고 하였으나, 문자열에서 개수를 찾고, 배열내의 가장 높은 숫자를 갖는 인덱스를 찾는것이 비 효율적이라 판단되었다.
- 받은 문자열을 sort하여 가장 많이 갖고 있는 문자를 순차적으로 찾으려고 하였으나 sort 자체가 무의미 하다고 생각되었다.
- 대소문자를 구별하지 않는다고 하여서 출력 포맷인 대문자로 받은 문자열을 바꾸어주어 문자를 찾을 때 수월하게 해주었다.
- for문을 'A' 부터 'Z'까지 한번 돌아 가장 큰 값을 갖는 문자와 그 개수를 기록하며 가장 큰값을 갖는것이 2개 이상일 경우 check변수를 통하여 기록해두었다.
for (auto a : s)
위 문법은 c11 이상에서 사용할 수 있는 문법입니다.
transform()
위 함수는 algorithm 헤더를 추가하여 사용해야 합니다.
이상한 점은, vscode에서 algorithm헤더를 추가하지 않고도 컴파일 및 실행이 되었는데 백준에선 컴파일 에러를 발생시켰습니다.