[C++] 1157번 – 단어 공부

문자열이 주어지면 문제는 해당 문자열에서 가장 자주 나타나는 알파벳을 반환하는 것입니다.

1. 얼마나 많은 알파벳이 등장했는지 알아야 하므로 알파벳이 몇 번 등장했는지를 저장하는 배열을 만들어야 합니다.

2. 등장알파벳의 개수를 배열로 저장하면 가장 많이 등장하는 알파벳이 1개 이상인지 판단하여 답을 반환한다.

#include <bits/stdc++.h>

using namespace std;

int alpha(26);
char ans=" ";

void Solve () {

    string s;
    cin >> s;

    int l = s.length ();

    for ( int i = 0 ; i < l ; i ++ ) {
        alpha( s( i ) % 32 - 1 ) ++;
        /*
         * alphabet의 대소문자 여부와 상관없이 같은 alphabet이라면 같은 index값을 갖게 합니다.

* alphabet 대문자의 ASCII코드는 65 ~ 90 이고, 소문자는 97 ~ 122 인데 * 65 = 32 * 2 + 1이고, 97 = 32 * 3 + 1이기 때문에 32로 나머지 연산을 했을 때의 값이 같아서 가능합니다.

*/ } int mx = *max_element (alpha , alpha + 26); // mx : 가장 많이 등장한 alphabet의 등장 횟수 /* * 여기서 max_element 함수는 alpha(0)에서 부터 alpha(25)까지의 값 중 max값의 주소를 반환합니다.

* 앞에 *를 붙임으로써 max값의 주소가 아닌 max값을 가져올 수 있습니다.

*/ for ( int i = 0 ; i < 26 ; i ++ ) { if ( alpha( i ) == mx ) { // 가장 많이 등장한 alphabet만 걸러주는 if문 if (ans == ' ') { /* * 가장 많이 등장한 alphabet을 찾았고, ans가 초기값이라면, * ans에 현재 alphabet을 저장해줍니다.

*/ ans = i + 65; // 인덱스에 +65(ASCII)를 해줌으로써 대문자 alphabet으로 변환 } else { /* * 가장 많이 등장한 alphabet을 찾았는데 ans가 초기값이 아니라면, * 가장 많이 등장한 alphabet이 한 개가 아니라는 뜻이므로 ans에 '?'를 저장해주고 break 합니다.

*/ ans="?"; break; } } } cout << ans; } int main () { ios_base::sync_with_stdio (false); cin.tie (nullptr); Solve (); return 0; }