문제 URL:
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
다음 문제는 알파벳 대소문자로 된 단어가 주어지면,
이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램으로
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력해준다.
단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
이 문제를 풀기위해 프로그램을 세 단계로 구상했는데, 그 단계는 아래와 같다.
1. 단어 즉 문자열을 모두 대문자로 바꾸기
2. 이전에 배열에 들어간 알파벳과 같은 알파벳이 아닐 때, 배열의 새 요소에 알파벳 입력하기
3. 알파벳이 중복된 횟수를 비교하여 결과 화면 출력하기
구상한 프로그램은 다음과 같이 작성해주었다.
먼저, 단어를 모두 대문자로 변환하기 위해 <cctype>에 존재하는 문자 함수 toupper() 함수를 사용하여 각 알파벳을 대문자로 바꾸어주었다.
그 다음 반복문 속 조건문을 사용하여 두 알파벳이 같지 않을 때만 배열에 입력해주었다.
이 과정에서는 배열 2개를 만들어 한 배열에는 알파벳 문자를 넣어주고, 다른 배열에는 각 문자마다 중복된 횟수를 세어주었다. 또한, 변수 n을 사용하여 만들어진 배열의 개수는 따로 세어주었다.
마지막으로 배열에 들어있는 각 문자가 중복된 횟수를 변수 maxC를 이용하여 반복해서 비교해주고 중복된 횟수가 가장 많은 문자를 최종적으로 변수 maxV에 담아 출력해준다. 단, 가장 많이 중복된 문자가 2개 이상이라면 ?를 출력해주었다.
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main()
{
string s;
cin >> s;
char* list = new char[s.length()];
int* countList = new int[s.length()]();
int n = 0;
for(int i=0; i<s.length(); i++)
{
char al = toupper(s[i]);
if(n==0)
{
list[n] = al;
n++;
}
for(int j=0; j<n; j++)
{
if((al!=list[j])&&(j==n-1))
{
list[n] = al;
n++;
}
else if(al==list[j])
{
countList[j]++;
break;
}
}
}
char maxV = list[0];
int maxC = countList[0];
for(int i=1; i<n; i++)
{
if(maxC<countList[i])
{
maxV = list[i];
maxC = countList[i];
}
else if(maxC==countList[i])
maxV = '?';
}
cout << maxV;
return 0;
}