알고리즘 문제 풀이

45. C++ 백준 1157 번 단어 공부

코딩하는 덕구 🐶 2022. 1. 25. 20:27
728x90
반응형

안녕하세요! 코딩하는 덕구입니다!

주어진 단어에서 가장 많이 사용된 알파벳을 출력하는 문제인 C++ 백준 1157 번 입니다!

문제

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

입력

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

출력

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

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

 

#include <iostream>
#include <string>
using namespace std;
int main(){
    int max=0, Mapbt[26] = {0,}, apbt;

    bool isMul = false;
    string str;
    cin>>str;
    for(int i =0; i<str.length(); i++){
        if(str[i] - 'Z' <= 0 ){
            Mapbt[str[i] - 'A']++;
        }

        else
            Mapbt[str[i] - 'a']++;
    }

    for(int i = 0; i<26; i++){
        if(Mapbt[i] > max){
            max = Mapbt[i];
            isMul = false;
            apbt = i;
        }

        else if(Mapbt[i] == max)
            isMul = true;
    }

    if(isMul==1)
        cout<<'?';

    else
        cout<<char(apbt + 65);

    return 0;
}

 

최대값을 저장할 변수 max, 알파벳별 등장 횟수를 저장할 배열 Mapbt,

최다 등장 알파벳을 저장할 변수 apbt 을 선언하고,

최빈 단어가 여러개인지 여부를 저장할 변수 isMul을 선언했습니다!

첫번째 for문에서는 

문자의 길이 만큼 for문을 돌려

문자가 대문자일때는 문자 -'A' , 소문자 일때는 문자 - 'a' 를 해주어

A 나 a 이면 0, B나 b이면 1 이런식으로 숫자로 치환해줬습니다!

그리고 알파벳이 등장하면 Mapbt의 그 숫자에 맞는 변수를 1 씩 증가시켜줘서

알파벳별 등장 횟수를 세주었습니다!

 

두번째 for 문에서는 

등장 횟수가 저장되어있는 Mapbt을 하나씩 탐색하며 최대값을 찾고, 최대값이 여러개면 

isMul을 true로 바꿔주어 표시해줬습니다!

 

이후 최대값이 여러개면 ?를 출력하고

기존의 알파벳은 A나 a 이면 0 으로 치환했지만 아스키 코드로 바꾸면

 출력해야 되는 대문자 알파벳이 나오지 않기 때문에 65를 더해주어서 char 형으로 출력했습니다!

(대문자 A는 ASCII 65부터 시작합니다!)

이해를 돕기위해서 ASCII 코드 표 첨부합니다!

위 표를 이용해여  문자를 ASCII로, ASCII를 문자로 바꿀수 있게 되면 제가 사용한 방법이 아니더라도 

여러가지 방법으로 코드를 짤 수 있겠죠!

C++ 백준 1157 번 이었습니다! 감사합니다~!

728x90
반응형