백준 1157

hyun20·2021년 7월 5일
post-thumbnail

단어의 알파벳 빈도수를 계산해 빈도수가 가장 높은 알파벳 출력
대소문자 구분 x 알파벳 출력시 대문자로 출력

두 문자 빈도수 같음-->? 출력
사용자가 입력한 문자열의 모든 문자 대문자로 바꾸기
소문자 판별: islower(문자열의 각 문자)
소문자->대문자: static_cast(각문자-’a’+’A’)
문자와 문자간 연산을 하면 int형이 되므로 char형으로 바꿔줘야함
alphaN[26]알파벳의 빈도수 저장
A가 등장하면 alphaN[0]++;
alphaN[문자열의 각문자-’A’]++;
alphaN의 인덱스=알파벳 순서(0부터)

alphaN[26] 중 최대값과 그의 인덱스를 저장
인덱스+’A’ 한 값이 출력값

특수 case: 최대 빈도수 문자 중복
temp를 통해 마지막 최대값 저장
max값과 비교해 같으면 중복된 값 존재
max는 최초의 최대값 저장

#include <iostream>
#include <string>
using namespace std;
int main() {
	string s;
	cin >> s;
	int alphaN[26] = { 0 }; //알파벳 빈도수
	for (int i = 0; i < s.length(); i++) {
		if (islower(s[i])) //소문자면 대문자로 바꿔주기
			s[i] = static_cast<char>(s[i] - 'a' + 'A');
		alphaN[s[i] - 'A']++;
	}
	int max = alphaN[0]; //최대 알파벳 빈도수
	int maxIndex = 0; //최대 알파벳 빈도수를 가진 알파벳 번호
	int temp = 0;
	for (int i = 1; i < 26; i++) {//i=0부터 하면 오류 발생(aaab가 ?가 나옴)
		if (max < alphaN[i]) {
			max = alphaN[i];
			maxIndex = i;
		}
		else if (max == alphaN[i]) //빈도수가 같은 알파벳이 있는지 확인
			temp = alphaN[i];
	}
	//중복을 확인하더라도 max값이 바뀔 수 있으니 반복문이 끝난후 마지막에 확인
	if (max == temp) //마지막으로 저장된 temp값이 최대 알파벳 빈도수와 같다면
		cout << "?" << endl;
	else
		cout << static_cast<char>('A' +maxIndex) << endl;
}

0개의 댓글