
문제 풀이
- 입력으로 주어진 알파벳의 횟수가 가장 많은 것을 구하는 문제이다.
- 대소문자는 구분되지 않는다
- 최대 알파벳의 개수가 동일한 경우 ? 를 출력한다.
- 해결 방법
1. int arr[26]을 만들어 arr[0] 은 a 부터 arr[25]는 z까지를 의미하며 각 횟수를 담는 배열을 만든다.
2. 문자열을 차례로 탐색하면서 arr배열에 개수를 추가한다.
3. arr배열을 탐색하면서 max를 탐색한다.
- 주의할 점
주어진 단어의 길이 알아내기 위해 strlen이라는 함수를 이용했다. 이 함수는 문자열 저음부터 문자열의 길이까지 탐색하는 함수이다. 따라서 문자열의 길이를 탐색하는데 시간이 걸리기 때문에 for 과 같은 반복문의 조건으로 들어가게 되면 시간이 초과되는 것을 볼 수 있다.. 미리 계산하여둔 변수를 이용하는 것이 좋다.
string.h 헤더 파일에 있는 함수이다. visual studio 와 같은 ide를 이용할 경우, 내장 되어 있으나, gcc 컴파일러를 이용하는 경우에는 반드시 헤더파일을 include 해주어야 이용가능하다.
C++ 코드
#include <iostream>
#include <string.h>
#include <algorithm>
#define MAX_SIZE 1000000
using namespace std;
char word[MAX_SIZE];
int main() {
// 소문자 대문자
// 97- 65 = 32
//단어의 길이 1000000을 넘지 않는다.
int alphabet[26] = { 0 };
int max_index = 0;
int max = 0;
int unique = 0;
cin >> word;
//strlen함수는 string.h헤더에 포함되어 있다. - gcc인 경우 수동 추가하기
int s_length = strlen(word);
sort(word, word + s_length);
//반복문에 strlen 함수를 추가하면 안된다.
// strlen은 문자열 처음~string길이 까지 찾기에 O(L^2) 를 가진다.
for (int i = 0; i < s_length; i++) {
//대문자 일 경우 소문자 변환
if (97 <= word[i] && word[i] <= 129)
word[i] -= 32;
// 알파벳 개수 추가
alphabet[word[i] - 65]++;
}
max = *max_element(alphabet, alphabet+26);
for (int i = 0; i < 26; i++) {
if (alphabet[i] == max) {
max_index = i;
unique++;
}
}
if (unique > 1)cout << "?\n";
else
cout <<char(max_index+65) <<"\n";
return 0;
}