백준/C++

[백준] 1157번: 단어 공부 | C++ 풀이

성실한 당근농부 2023. 5. 22. 12:26

# 문제

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

 

 


 

# 풀이

그간 풀었던 것들을 잘 조합하면 어렵지 않게 풀 수 있다.

단계를 나누어 생각해보자.

정답 소스코드부터 확인!

 

#include <iostream>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);	// 두 표준 입출력 동기화 해제 
    int alphabet[26] = {0};
    string s;
    
    cin >> s;
    int len = s.length();
    
    // step 1. 등장 알파벳 개수 세기
    for(int i=0; i<len; i++){
        if(s[i] < 91) alphabet[s[i] - 65]++; // 대문자 65-90
        else alphabet[s[i] - 97]++; // 소문자 97-122
    }

    int max = 0;
    int maxidx = 0;

    // step 2. 최대 카운트 값 탐색
    for(int i=0; i<26; i++){
        if(max < alphabet[i]) {
            max = alphabet[i];
            maxidx = i;
        }
    }

    // step 3. 최대 인덱스 개수 탐색 및 출력
    int cnt = 0;
    for(int i=0; i<26; i++){
        if(max == alphabet[i]) cnt++;
        if(cnt > 1) {
            cout << '?';
            break;
        }
    }
    if(cnt == 1) cout << (char) (maxidx+65);

    return 0;
}

 

알파벳의 개수는 고정이므로 알파벳을 세어줄 배열을 생성하고 0으로 초기화한다.

그리고 알파벳을 셀 단어 입력받으면 준비 끝.

 

 

📌 STEP 1. 등장 알파벳 개수 새기

// step 1. 등장 알파벳 개수 세기
for(int i=0; i<len; i++){
    if(s[i] < 91) alphabet[s[i] - 65]++; // 대문자 65-90
    else alphabet[s[i] - 97]++; // 소문자 97-122
}

등장 알파벳의 개수를 세는 건 아스키 코드 값을 활용해주었다.

주석에 적어둔 것처럼 영어 대문자의 아스키 코드 값은 65-90(A-Z), 소문자는 97-122(a-z)다.

입력에 대소문자로 이루어진 단어가 주어진다고 했으니 대문자인지 소문자인지만 구별해 계산해주면 되는데 대문자 마지막 값인 90을 기준 삼아 구간을 나눠주었다.

그리고 대문자, 소문자를 구분하지 않고 같은 알파벳 배열에 등장 횟수를 저장하면 step 1은 끝이다.

 

 

📌 STEP 2. 최대 카운트 값 탐색

int max = 0;
int maxidx = 0;

// step 2. 최대 카운트 값 탐색
for(int i=0; i<26; i++){
    if(max < alphabet[i]) {
        max = alphabet[i];
        maxidx = i;
    }
}

두번째는 만들어둔 알파벳 배열을 통해 가장 사용된 알파벳의 등장 횟수를 찾아주는 것이다.

이를 위해 max, maxidx 변수를 만들고 for문을 돌며 탐색을 수행해주었다.

 

 

📌 STEP 3. 최대 인덱스 개수 탐색 및 출력

// step 3. 최대 인덱스 개수 탐색 및 출력
int cnt = 0;
for(int i=0; i<26; i++){
    if(max == alphabet[i]) cnt++;
    if(cnt > 1) {
        cout << '?';
        break;
    }
}
if(cnt == 1) cout << (char) (maxidx+65);

마지막으로 찾아준 최다 등장 횟수를 통해 가장 많이 사용된 알파벳이 여러 개 존재하는지를 탐색하면 된다.

ex. 가장 많이 등장한 알파벳 C일 경우
C를 출력하기 위해서 대문자 C의 아스키 코드 값을 찾아야 한다.

c, C의 등장 횟수는 alphabet[2]에 저장되어 있으므로 2+65를 해주면 대문자 C의 아스키 코드 값인 67를 찾을 수 있고,
이를 char 형으로 변환해 출력해주면 된다.

 

cnt 변수를 통해 가장 많이 사용된 알파벳이 한 개 이상 존재하는 순간을 검사하고, 해당하면 '?'를 출력한 후 반복문을 벗어나도록 했다. for문 바깥쪽에서는 가장 많이 사용된 알파벳이 한 개일 경우를 검사하고 해당하는 알파벳의 대문자 값을 출력해주면 끝이다.

 

 

 

 


 

 

 

1157번: 단어 공부

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

www.acmicpc.net

 

728x90