본문 바로가기
프로그래밍 ( Programming )/백준 알고리즘 (BaekJoon Algorithm)

1157번 - 단어 공부 ( 백준 알고리즘/C++ )

by Jayce_choi 2020. 12. 14.
반응형

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

단, 대문자와 소문자를 구분하지 않는다.

 

입력 : 첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다.

주어지는 단어의 길이는 1,000,000을 넘지 않는다.

 

출력 : 첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다.

단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는?를 출력한다.

 


#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	int is_same=0,Max=0,Max_index;
	int num[27] = { 0, };
	char arr[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	string S;
	cin >> S;
	for (int j = 0;j < S.length();j++)
		for (int k = 0;k < strlen(arr);k++)
			if (S[j] == arr[k] || S[j] == (arr[k]+32))
				num[k] = num[k] + 1;

	for (int i = 0; i < strlen(arr);i++)
		if (num[i] >= Max)
		{
			Max = num[i];
			Max_index = i;
		}

	for (int i = 0; i < strlen(arr);i++)
		if (num[i] == Max)
			is_same++;
	if (is_same >= 2)
		cout << "?";
	else
		cout << arr[Max_index];
		
		
	return 0;
}

 

중요 포인트

- 입력된 문자열에 대해서 각 자리의 알파벳 개수 파악 반복문 구현
   ( 대소문자에 따른 구분을 위한 아스키 코드 표 참고 ) 
- 최대로 입력된 개수를 파악하기 위한 Max 변수 설정
- 동일한 Max값이 나타나는 문자가 있는지 파악하기 위한 is_same 변수 설정
- 최종적으로 is_same 변수의 값을 이용한 출력 시행

 

해설

총 3개의 반복문으로 구성하였다. 
- 첫번째 반복문 ( 각 자리의 알파벳 개수 파악 ) 
- 두번째 반복문 ( 최대 개수를 파악 )
- 세번째 반복문 ( 최대 개수가 2번 이상 나타나는지 확인 )

중요한 점은 대소문자 구별을 위해서 아스키코드 값을 알아야 한다. 
char A와 char a는 32 차이가 존재한다.
때문에 기존에 대문자로 구성된 배열을 선언하고 ( char arr[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; )

비교할 때는 if (S[j] == arr [k] || S [j] == (arr [k]+32))처럼 써줌으로써 소문자, 대문자 관계없이 파악 가능해진다.

 

 

 

반응형

댓글