728x90
반응형

문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

예제 입력 1

Mississipi

예제 출력 1

?

예제 입력 2

zZa

예제 출력 2

Z

예제 입력 3

z

예제 출력 3

Z

예제 입력 4

baaa

예제 출력 4

A

 

내가 작성한 코드 (C++ 성공)

#include <iostream>

using namespace std;

int main(){
	string s;
	int a[27] = {0};
	
	cin >> s;
	
	for(int i=0; i<s.length(); i++){
		if(s[i] >= 97){
			s[i] = s[i] - 32;
		}
		a[s[i]-65]++;
	}
	
	int max = 0;
	int index;
	int cnt = 0;
	
	for(int i=0; i<26; i++){
		if(max < a[i]) {
			max = a[i];
			index = i;	
		}
	}
	
	for(int i=0; i<26; i++){
		if(i != index) {
			if(max == a[i]) cnt++;	
		}
	}
	
	if(cnt != 0){
		cout << "?\n";
	} else {
		cout << (char)(index+65) << "\n";	
	}
	
	return 0;
}

 

정리

한 단계씩 차근차근 코드를 작성했던 문제다.
문제를 풀면서 어떻게하면 더 간결하게 풀 수 있을까 라는 생각을 많이했는데 더 고민을 해봐야겠다.
맞은 코드는 정말 한단계 한단계 차례대로 밟아가며 작성한 코드다.

1. 문자열을 입력한다.
2. 문자열을 입력하면서 전부 대문자로 변환한다.
3. 아스키 코드를 이용해서 0부터 25까지 알파벳 배열을 만들어 카운트해준다.
4. 카운트가 높은 배열의 값을 최댓값으로 정해놓는다.
5. 다시 알파벳 배열에서 최댓값과 같은 값이 있는지 찾는다.
6. 최댓값과 같은 값이 있다면 '?' 를 출력하고
   없다면(카운트 0) 가장 많이 사용된 알파벳의 아스키코드 값을 문자로 치환해서 출력한다.

728x90
반응형
복사했습니다!