본문 바로가기
백준 알고리즘 단계별 풀이 (문제 수)/문자열 (10)

[C++] 단어 공부(가장 많은 알파벳 찾기) : 1157번

by 17번 일개미 2022. 7. 2.
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