소스코드
#include <iostream>
#include <cstring>
using namespace std;
char alpabet[27] = {'A','B','C','D','E','F','G','H','I',
'J','K','L','M','N','O','P','Q','R',
'S','T','U','V','W','X','Y','Z','?'};
int main(){
int result[26] = {0,};
int check = 0;
string s;
cin >> s;
for(int i = 0; i < s.length(); i++){
s[i] = toupper(s[i]);
for(int j = 0; j < 26; j++){
if(s[i] == alpabet[j]){
result[j]++;
}
}
}
int max = result[0]; //최빈값
int maxidx = 0; //많이 나온 알파벳의 인덱스
for(int i = 1; i < 26; i++){
if(max == result[i]){
maxidx = 26;
continue;
}
if(result[i] > max){
max = result[i];
maxidx = i;
}
}
cout << alpabet[maxidx] << endl;
return 0;
}
- 변수
char alpabet[27] : 알파벳과 ?을 저장해둔 배열
int result[26] : 최빈값을 조사하기 위한 배열
string s : 입력받은 문자열
int max : 최빈값 int maxidx : 가장 많이 나온 알파벳의 인덱스
- 알고리즘
- 문자열을 입력받아 모든 알파벳을 대문자로 바꿨다.(대소문자의 구분 없애기 위해)
- 문자열의 각 문자를 알파벳 배열과 비교하여 해당하는 알파벳의 인덱스의 result배열의 값을 더해준다.
- (보완 전 단계 알고리즘)
1) max값에 result[0](a의 빈도수)를 기준으로, maxidx는 0을 기준으로
for문을 돌면서 가장 많이 나온 값을 찾아준다
2) max, maxidx값이 결정되면 max값과 중복되는 값이 있는지 찾기 위해서
for문을 다시 돌려서 만약 check값(result[i] == max)이 2개 이상이면 ?를 출력하고 리턴한다.- (보완 후 알고리즘)
일단은 for문을 두번 연속 쓰는것, check라는 변수를 한개 더 만드는 것을 줄일 수 있는 방법을 찾고 싶었다.
1) ?를 alpabet배열에 저장해둔다.
2) 만약 max==result[i]라면 max값을 ?로 만들어주고 continue
3) 그 다음에 max를 비교하는 코드를 둔다.
4) 이렇게 하면 만약 문자열 내에 많이 나온 알파벳 값이 2개 이상이더라도 미리 ?로 값이 정해져 있기 때문에 걸러지게 된다.- 마지막으로 alpabet[maxidx]를 출력해준다.
```
int max = result[0]; //최빈값
int maxidx = 0; //많이 나온 알파벳의 인덱스
for(int i = 1; i < 26; i++){
if(result[i] > max){
max = result[i];
maxidx = i;
}
}
for(int j = 0; j < 26; j++){
if(result[j] == max){
check++;
if(check >= 2){
cout << '?' << endl;
return 0;
}
}
}
```
- 배운점
1) 대문자 : toupper(char) / 소문자 : tolower(char) =>
2) continue : 코드 실행 건너뛰기
- 아쉬운점&느낀점
일차적으로는 먼저 내가 생각한대로 코드를 돌려 맞는게 우선이다. 쨌든 코딩테스트에선 그게 장땡이기 때문에, 하지만 연습하는 지금 과정에서는 다른 사람들의 방법을 많이 찾아보면서 배우는 것이 아주 중요하다. 간혹 더 많은 문제를 풀기 위해서, 어차피 맞았는데 굳이 다른 사람의 코드를 읽어봐야 되나라는 안일한 생각은 오로지 일차적인 방법만 쓰는 나에게 전혀 도움이 되지 않는다는 것을 다시 한번 상기시켜야겠다.