본문 바로가기

백준 문제 풀이/c++

백준 1157번 "단어 공부" -- c++

728x90

안녕하세요! 오늘은 백준 1157번 "단어 공부" 문제를 풀어보겠습니다.

문제 설명

  • 알파벳 대소문자로 이루어진 단어가 주어진다.
  • 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력하는 프로그램을 작성하라.

입력

  • 첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. (1 ≤ 단어의 길이 ≤ 1,000,000)

출력

  • 첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다.

풀이 방법

  1. 알파벳 개수 세기 (count 배열 사용)
  2. count 배열에서 max 값 찾기
  3. max 값이 중복되면 ? 출력

입력으로는 알파벳 대소문자로 이루어진 단어가 주어집니다. 이 때, 주어지는 단어의 길이는 1,000,000을 넘지 않습니다.

이 문제를 해결하는 가장 간단한 방법은 알파벳의 사용 빈도를 세는 것입니다. 대소문자를 구분하지 않으므로, 입력으로 주어진 단어를 모두 소문자로 변환한 후 알파벳의 사용 빈도를 세면 됩니다.

  1. 알파벳 개수 세기 (count 배열 사용)
  2. count 배열에서 max 값 찾기
  3. max 값이 중복되면 ? 출력

아래는 이 문제를 해결할 수 있는 C++ 코드입니다:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    string word;
    cin >> word;

    transform(word.begin(), word.end(), word.begin(), ::tolower);

    int freq[26] = {0};

    for (char c : word) {
        freq[c - 'a']++;
    }

    int maxFreq = 0;
    char maxChar;

    for (int i = 0; i < 26; i++) {
        if (freq[i] > maxFreq) {
            maxFreq = freq[i];
            maxChar = 'A' + i;
        } else if (freq[i] == maxFreq) {
            maxChar = '?';
        }
    }

    cout << maxChar << endl;

    return 0;
}

이 코드는 먼저 입력으로 받은 단어를 소문자로 변환한 후, 알파벳의 사용 빈도를 세는 배열 freq를 초기화합니다. 그리고 각 알파벳이 나타날 때마다 해당하는 배열 요소를 증가시킵니다.

마지막으로, 가장 많이 사용된 알파벳을 찾기 위해 배열 freq를 순회하면서 최댓값을 갱신하고, 해당 알파벳을 저장합니다. 만약 최댓값과 같은 빈도를 가진 알파벳이 여러 개 있다면 '?'를 저장합니다.

이렇게 간단한 알고리즘을 이용하여 문제를 해결할 수 있습니다.

728x90