궤도

[백준] 1157번 : 단어 공부 본문

💻 현생/⛓ 알고리즘

[백준] 1157번 : 단어 공부

영이오 2020. 10. 13. 17:31

문제

 


풀이

 

일단 알파벳의 등장 횟수를 체크해야하니 알파벳의 개수만큼의 크기를 가진 배열(alpha[26])을 만들어준다. 소문자 영어의 아스키코드는 97부터 시작하고 대문자 영어의 아스키코드는 65부터 시작한다. 소문자와 대문자를 구분하지 않으니 대소문자 여부를 판단해 적절히 alpha 배열에 넣어준다.

 

완성된 alpha 배열을 돌며 최대값을 찾아야 하는데, 그와 동시에 해당 최댓값에 해당하는 알파벳이 2개 이상인지도 체크해야 한다. 이를 위해 bool 변수 flag를 뒀다. 영어 대소문자 문제는 많으니까 각각의 아스키코드를 외워두는게 나쁘진 않을 것 같다.


소스코드

 

#include <iostream>
#include <cstring>
using namespace std;

int main() {
	int alpha[26], max = 0, max_pos, i_word, i;
	char word[1000000];
	bool flag;
	for (i = 0; i < 26; i++)
		alpha[i] = 0;

	cin >> word;
	int length = strlen(word); //strlen을 for에 넣었더니 시간초과
	for (i = 0; i < length; i++) {
		if (word[i] >= 97) //_strupr_s 썼더니 런타임에러
			i_word = (int)word[i] - 97;
		else
			i_word = (int)word[i] - 65;
		alpha[i_word]++;
	}
	for (i = 0; i < 26; i++) {
		if (alpha[i] > max) {
			max = alpha[i];
			max_pos = i;
			flag = false; //max 갱신하면 flag도 초기화 해야함
		}
		else if (alpha[i] == max)
			flag = true; //flag가 true면 가장 많이 나온 숫자가 2개 이상이란 뜻
	}
	if (flag)
		cout << '?' << '\n';
	else
		cout << (char)(max_pos + 65) << '\n';
}
Comments