문제 링크입니다 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 == -1) cout << '?' << "\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 == -1) printf("?");
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 |