갓생살기프로젝트

[백준/BOJ/C++] 1157번 단어 공부 - 문자열 본문

차근차근 알고리즘/etc.

[백준/BOJ/C++] 1157번 단어 공부 - 문자열

Heeyeon.dev 2021. 2. 14. 01:56
728x90

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

1. 문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.


2. 입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.


3. 출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.


4. 풀이

문자열 문제는 C++ string 클래스 멤버 함수 사용하는 방법을 연습하기에 아주 좋다.

이 단어 공부 문제에서는 at() 함수와 단순한 아스키코드값의 이해를 바탕으로 풀이할 수 있다.

- word.at(index)
인덱스에는 숫자가 들어가게 되고, 해당 위치에 해당하는 문자를 반환한다.  string을 배열처럼 끊어서 사용한다고 생각하면 쉽다. 그래서 인덱스도 0번부터 시작한다.

단어를 at 함수를 사용해서 각각 분리했다면 이제 각 알파벳별로 개수를 카운트해야 한다. 알파벳 개수는 alphabet 배열에 저장하는데, 0번 인덱스부터 25번 인덱스까지 a에서 z까지의 사용된 개수를 저장한다.

대소문자를 각각 확인해줘야 하는데, 아스키코드 값이 대문자 A와 Z 사이이면 'A'를 뺀 값을 인덱스로 하여 카운트를 늘려주고, 소문자는 'a'를 뺀 값을 인덱스로 하여 카운트를 늘려준다.

그렇게 해서 alphabet 배열에 사용된 알파벳 개수를 모두 저장한 다음 최댓값을 구해준다.

최댓값이 여러 개 존재하는 경우를 확인하기 위해 구한 최댓값과 동일한 값이 alphabet 배열에 2개 이상 존재하는지 확인한다. 


5. 소스코드

#include <iostream>
using namespace std;
int main(){
    string word;
    cin>>word;
    int alphabet[26] = {0, };
    for(int i = 0; i < word.size(); i++){
        if(word.at(i) >= 'A' && word.at(i) <= 'Z'){
            alphabet[word.at(i) - 'A']++;
        }
        else if(word.at(i) >= 'a' && word.at(i) <= 'z'){
            alphabet[word.at(i) - 'a']++;
        }
    }
    int max = 0; char result;
    for (int i = 0; i < 26; i++){
        if(alphabet[i] >= max){
            max = alphabet[i];
            result = i + 'A';
        }
        
    }
    int count = 0;
    for(int i = 0; i < 26; i++){
        if(max == alphabet[i]){
            count++;
        }
    }
    if(count > 1){
        cout<<"?";
    }
    else{
        cout<<result;
    }
    return 0;
}

 

728x90