[BOJ] 1157_단어공부

gogori6565·2022년 7월 22일
0

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


풀이
1. 단어에 사용된 각 알파벳의 빈도 수를 체크한다.
2. 단어에 가장 많이 사용된 알파벳을 구한다.
3. 가장 많이 사용된 알파벳을 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개일 경우, "?"를 출력하도록 조건을 걸어준다.

📌 (1) 빈도 수 체크 방법 두 가지

  • 1) 배열의 인덱스 자체에 접근해 아스키코드로 푸는 방법
  • 2) 단어의 각 알파벳 하나하나 비교해 일치할 경우 배열을 ++하는 방법

나는 처음에 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;
}

굳이 이렇게 어렵게 갈 필요가 없었다^!^


문제 출처 : https://www.acmicpc.net/problem/1157

profile
p(´∇`)q

0개의 댓글