백준풀기

[c++] 백준 1157번 단어공부 (아스키코드 이용법)

해언뵤 2024. 2. 4. 02:44

문제

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

 

입력

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

 

출력

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

 

 

문제풀이

**배열을 전역변수로 선언하면 자동적으로 0으로 초기화된다. 지역변수는 초기화를 시켜야 한다.
처음 for문은 대문자와 소문자를 따로 구분해서 알파벳배열 순서대로 몇개인지 센다. 아스키코드에서 대문자는 65~90이고 소문자는 97~122이므로 아스키코드를 이용해서 코드를 구현한다.
두번째 for문에서는 가장 많이 세어진 알파벳을 확인한다. max를 0으로 초기화해놓고 max보다 크면 alpha[i]의 값을 넣어준다. 나중에 출력을 위해 max_index값도 받아둔다.
마지막 for문에서는 가장 많이 세어진 알파벳이 여러개인지 확인한다. cnt값이 1보다 크면 중복이 있는 것이므로 ?를 출력하고 아니라면 받아둔 max_index+65(대문자로 만들기 위함)의 char를 출력해주면 된다.
#include <iostream>
#include <string>
using namespace std;

int alpha[26], cnt = 0;
string s;

//대문자 65-90 소문자 97-122

int main(){

    cin >> s;

    for(int i = 0; i < s.length(); i++){
        if (s[i]<91) alpha[s[i]-65]++; //대문자
        else alpha[s[i]-97]++; //소문자
    }

    int max = 0, max_index = 0;
    for (int i = 0; i < 26; i++){ //가장많이세진알파벳확인
        if (max < alpha[i]){
            max = alpha[i];
            max_index = i;
        }
    }

    for (int i = 0; i < 26; i++){ //가장많이사용한 알파벳이 여러개인지
        if (max == alpha[i]) cnt++;
    }

    if (cnt > 1) cout << "?";
    else cout << (char)(max_index+65);
}

'백준풀기' 카테고리의 다른 글

[c++] 백준 8958번 OX퀴즈  (0) 2024.02.04
[c++] 백준 2920번 음계 (compare함수)  (0) 2024.02.02
[c++] 백준 1037번 약수  (0) 2024.02.02
[c++] 백준 2442번 별찍기-5  (0) 2024.02.02
[c++] 백준 2440번 별찍기-3  (0) 2024.02.02