[テストコード]学習白俊1157単語-C++



問題を解く


これは
  • 入力で与えられたアルファベットを求める回数が最も多い問題である.
  • 大文字と小文字を区別しない
  • 最大アルファベット数は同じですか?出力します.
  • ソリューション
    1.int arr[26]を作成し、arr[0]はaからarr[25]がzであることを示し、各回数を含む配列を作成する.
    2.文字列を1つずつ参照し、arr配列に個数を追加します.
    3.arr配列を参照しながらmaxを参照します.
    -注意事項
    与えられた単語の長さを見つけるためにstrlenという関数を用いた.この関数は文字列の低音から文字列の長さまでのプローブ関数です.したがって、文字列の検索に時間がかかるため、forなどの重複文の条件に入るとタイムアウトが表示されます.不動態変数を利用して事前に計算したほうがいい.
    string.hヘッダファイルの関数.visualstudioなどのIDEを使用する場合は、ヘッダファイルを含める必要があります.
  • 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;
    }