문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳을 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
풀이
1. 단어에 사용된 각 알파벳의 빈도 수를 체크한다.
2. 단어에 가장 많이 사용된 알파벳을 구한다.
3. 가장 많이 사용된 알파벳을 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개일 경우, "?"를 출력하도록 조건을 걸어준다.
📌 (1) 빈도 수 체크 방법 두 가지
나는 처음에 2번으로 풀었다가, 다른 사람들 풀이 보다가 더 효율적인 1번 코드를 발견해 1번 코드에 대해 설명해보겠다!
풀이 코드
전체 코드
#include<iostream>
#include<string>
using namespace std;
int main(void){
cin.tie(NULL); ios_base::sync_with_stdio(false);
string s;
cin>>s;
//아스키코드 A:65, a:97
/*1. 빈도수 체크*/
int alp[26]={0,};
for(int i=0;i<s.size();i++)
{
if((int)s[i]<97) //대문자이면
alp[(int)s[i]-65]++;
else //소문자이면
alp[(int)s[i]-97]++;
}
//2. 가장 많이 나온 알파벳 구하기
int max=alp[0], max_index=0, same=-1;
for(int i=1;i<26;i++)
{
if(alp[i]>max)
{
max=alp[i];
max_index=i;
}
else if(alp[i]==max)
same=alp[i];
}
//3. 가장 많이 나온 알파벳 출력 (단, 여러 개일 경우 ? 출력)
if(max==same)
cout<<"?";
else //인덱스 0은 대문자 A:65
cout<<(char)(max_index+65);
return 0;
}
빈도수 체크 (방법 1)
1) 배열의 인덱스 자체에 접근해 아스키코드로 푸는 방법
/*1. 빈도수 체크*/
for(int i=0;i<s.size();i++)
{
if((int)s[i]<97) //대문자이면
alp[(int)s[i]-65]++;
else //소문자이면
alp[(int)s[i]-97]++;
}
대문자 A의 아스키코드 : 65
소문자 a의 아스키코드 : 97
문자열 s의 각 알파벳들(s[i])이 어차피 알파벳이라 아스키코드를 가지고 있으니까 바로 배열 인덱스로 접근하자!
대문자인 경우, 소문자인 경우 두 케이스로 분리해서
alp[] 배열의 인덱스로 대문자이면 해당 알파벳의 -65한 만큼, 소문자이면 -97만큼 빼서 빈도 수를 체크해주면 된다.
빈도수 체크 (방법 2)
2) 단어의 각 알파벳 하나하나 비교해 일치할 경우 배열을 ++하는 방법
/*빈도수 체크 2*/
int up=65, low=97;
for(int i=0;i<s.size();i++)
{
for(int j=0;j<26;j++)
{
if((int)s[i]==up || (int)s[i]==low)
alp[j]++;
up++;
low++;
}
up=65;
low=97;
}
굳이 이렇게 어렵게 갈 필요가 없었다^!^