알고리즘/BaekJoon

백준 1157 : 단어 공부

꾸준하게 :) 2020. 3. 10. 19:14

문제 링크입니다 https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 대문자로 출력하는 문제였습니다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 '?'를 출력해야 합니다. 대소문자 구분이 없이 개수를 세어야 하므로 아스키코드를 잘 활용해야 하는 문제였습니다. 문제 풀이 절차는 다음과 같습니다.

 

[1] 문자열을 입력받고 문자열의 처음부터 끝까지 확인하며 각 알파벳이 몇 개 있는지 세어줍니다.

'A' : 65, 'Z' : 90, 'a' : 97, 'z' : 122이므로 알파벳 하나를 확인했을 때, 만약 'A'였다면 'A'를 뺀 값은 0이 되고 'Z'였다면 'A'를 뺀 값은 25가 됩니다. 'a'였다면 32가 되므로 -32를 해주면 'a'도 0이 됩니다.

 

[2] 26개의 알파벳의 개수를 모두 저장한 배열을 처음부터 끝까지 보면서 가장 큰 값을 저장하고 있는 알파벳을 찾습니다. 최댓값과 똑같은 값이 있는지도 체크합니다.

 

[3] 가장 많은 개수를 저장하고 있는 알파벳을 찾았으면 'A'의 아스키 값인 65를 더해 출력합니다.

 

※ C++언어 코드 아래의 C언어 코드에서 만약, for문 안에 strlen 함수를 쓰면 시간 초과가 납니다..!

 

 

[소스코드 - C++]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream>
#include<string>
using namespace std;
 
int main(void) {
 
    string s;
 
    // 26개의 알파벳의 개수를 저장합니다
    int alpha[26= { 0, };
    cin >> s;
 
    // 'A' : 65, 'Z' : 90
    // 'a' : 97, 'z' : 122
    for (char c : s) {
        // [1] 만약 대문자라면 -'A'를 한 값에 해당하는 인덱스로 접근
        //     만약 소문자라면 -'A'를 하고 추가적으로 -32를 해줍니다
        if (c - 'A' <= 25) alpha[c - 'A']++;
        else alpha[c - 'A' - 32]++;
    }
 
    // [2] 가장 많이 발견된 알파벳의 개수를 찾고 해당 인덱스를 찾습니다
    int max = 0, ans = 0;
    for (int i = 0; i < 26; i++) {
        if (max < alpha[i]) {
            max = alpha[i];
            ans = i;
        }
        // [2] 최댓값과 똑같은 값이 있다면 인덱스 값에 -1을 넣습니다
        else if (max == alpha[i]) ans = -1;
    }
    if (ans == -1cout << '?' << "\n";
    else cout << (char)(ans + 65<< "\n"// [3]
    return 0;
}
cs

 

 

 

[소스코드 - C]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<cstdio>
#include<cstring>
using namespace std;
 
char str[1000001];
int alpha[26];
 
int main(void) {
 
    scanf("%s", str);
    int len = strlen(str);
 
    // for(int i = 0; i < strlen(str); i++)는 시간초과가 납니다..
    for (int i = 0; i < len; i++) {
        if (str[i] - 'A' > 25)
            str[i] = str[i] - 32;
        alpha[str[i] - 'A']++;
    }
 
    int max = 0, ans = 0;
    for (int i = 0; i < 26; i++) {
        if (max < alpha[i]) {
            max = alpha[i];
            ans = i;
        }
        else if (max == alpha[i]) ans = -1;
    }
 
    if (ans == -1printf("?");
    else printf("%c", ans + 65);
 
    return 0;
}
 
cs

 

'알고리즘 > BaekJoon' 카테고리의 다른 글

백준 15656 : N과 M(7)  (0) 2020.03.11
백준 5622 : 다이얼  (0) 2020.03.10
백준 1152 : 단어의 개수  (0) 2020.03.10
백준 10942 : 팰린드롬?  (0) 2020.03.10
백준 1890 : 점프  (0) 2020.03.10