728x90
문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
예제 입력 1
Mississipi
예제 출력 1
?
예제 입력 2
zZa
예제 출력 2
Z
풀이
#include <iostream>
using namespace std;
int main()
{
string s; // 문자열
int alphabet[27] = { 0, }; // 알파벳 갯수 배열 26개
int max = 0; // 최댓값
int samePair = 0;
int index = 0;
cin >> s; // 문자열 입력
cin.ignore();
for (int i = 0; i < s.size(); i++) // 문자 한글자씩 확인
{
if (s[i] >= 65 && s[i] <= 90) // 대문자라면
{
s[i] = s[i] + 32; // 소문자로 변경
}
if (s[i] >= 97 && s[i] <= 122) // 소문자라면
{
alphabet[s[i] - 'a'] += 1; // 해당 알파벳 갯수 세기
//cout << alphabet[i] << ' ';
}
}
for (int i = 0; i < 26; i++) // 알파벳 배열 순회
{
if (max < alphabet[i]) // 최댓값이면
{
max = alphabet[i]; // 최댓값 저장
index = i; // 최댓값 알파벳 인덱스 저장
}
else if (max == alphabet[i]) // 최댓값이랑 같은게 나온다면
{
samePair = max; // 현재 최댓값을 저장해두었다가
}
}
if (samePair == max) // 같은값이 존재하는 최댓값이 여전히 최댓값이면
{
cout << "?"; // 같은값이 나온 이후의 최댓값이 없다는 뜻
}
else cout << (char)(index + 65); // 그게 아니면 최댓값의 인덱스에 해당하는
} // 알파벳 출력
로직
0. 알파벳 배열 (alphabet[27]) 은 0~26번 인덱스를 사용하며,
각 인덱스는 0번부터 A, 1번 B... 26번 Z 의 의미를 가진다.
1. 문자열을 입력받는다.
2. 문자열을 한 글자씩 순회하면서, 대문자를 찾는다.
3. 대문자를 아스키 코드 값에 의거하여 모두 소문자로 전환시킨다.
4. 소문자로 변경된 문자들을 순회하며, 해당하는 알파벳 갯수를 센다.
5. 이제 알파벳 배열에는 각 알파벳 별 갯수가 저장되어 있다.
6. 알파벳 배열을 순회하면서 최댓값을 저장한다.
7. 그와 동시에 최댓값을 가지는 인덱스 i 도 같이 저장한다.
8. 저장하려는 값이 현재 최댓값과 동일한지 검사한다.
9. 만약 동일하다면 최댓값이 중복된다는 의미이다.
10. 따라서, 중복값이면서 최댓값이 나타날 때 마다 중복되는 값을 samePair에 저장해둔다.
11. 마지막으로 아직도 samePair에 있는 값이 여전히 최댓값이라면 중복이라는 의미이므로 "?" 를 출력한다.
12. 그게 아니라 samePair보다 max가 더 크다면,
중복값 이후에 또 다른 최댓값이 나왔다는 뜻이므로, 해당 알파벳을 출력한다.
728x90
'백준 알고리즘 단계별 풀이 (문제 수) > 문자열 (10)' 카테고리의 다른 글
[C++] 상수(세자리 수 뒤집어서 크기비교) : 2908번 (0) | 2022.07.03 |
---|---|
[C++] 단어의 갯수 : 1152번 (0) | 2022.07.03 |
[C++] 문자열 반복 / 단어 재조합하기 : 2675번 (0) | 2022.06.28 |
[C++] 알파벳 찾기 : 10809번 (0) | 2022.06.26 |
[C++] 문자형 숫자의 합 : 11720번 (0) | 2022.06.26 |