[알고리즘] 백준 1157번 단어 공부 (C)

devicii·2021년 8월 28일
0

c

목록 보기
4/6

문제

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

입력

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

출력

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

예제 입력 1 예제 출력 1
Mississipi  ?
예제 입력 2 예제 출력 2
zZa          Z
예제 입력 3 예제 출력 3
z 		   Z
예제 입력 4 예제 출력 4
baaa	   A

Code



#include <stdio.h>
#include <string.h>
#include <limits.h>
// 1 인풋 입력
// 2 문자열을 돌아가며 문자의 갯수를 알아간다
// 3 반복할 때마다 max보다 크다면 해당 문자를 max로 할당

int main(){
	char apb[1000001];
	int count[123] = { 0, };
	int max = INT_MIN;
	int maxApb, div=0, length;

	scanf("%s", apb);
	length = strlen(apb);

	for (int i = 0; i < length; i++)
	{
		for (int j = 65; j < 91; j++)
		{
			if(j == apb [i])
			{
				count[j]++;
			}
		}
		for (int j = 97; j < 123; j++)
		{
			if(j == apb [i])
			{
				count[j - 32]++;
			}
		}
	}
	for (int i = 65; i < 91; i++)
	{
		if(count[i] > max)
			{
				max = count[i];
				maxApb = i;
			}
	}
	for (int i = 65; i < 91; i++)
	{
		if(max == count[i])
		{
			div++;
		}
	}

	if(div >  1){
		printf("?");
	}
	else
	{
		printf("%c", maxApb);
	}

	return 0;
}








풀이

  • 모든 출력을 대문자로 하면 된다. 즉 소문자로 입력이 들어오면 소문자 아스키 코드 - 32를 하면 대문자 아스키 코드 값이 나오기 때문에 소문자를 대문자로 변환하면 된다.

  • 두 개의 for를 만들어서 한 개는 소문자 아스키 값을 구하고, 또 하나는 대문자 입력값을 위한 for문을 만든다. 중요한 점은 소문자를 위한 for은 count배열을 카운팅할 때 -32를 해줘서 카운팅 한다. 그렇게 한다면 대문자 아스키 코드 값이 카운팅 되기 때문.

  • 예를 들어 AaB를 입력한다면 A는 count배열의 65번째의 값이 ++이 되고, 그 다음 소문자 a는 원래라면 97번째 값이 카운팅 되어야 하지만 -32를 해줬기 때문에 65번째의 값이 카운팅 된다.

  • 그렇게 한 뒤 for문에서 i값을 65부터 시작하고 90번째까지 돌리며 if문에서 count의 값 중 제일 큰 값을 가진 배열의 위치를 알아내고 max에 할당한다. 그리고 알파벳은 i와 같기에,
    i를 maxApb에 할당한다.

  • 그 다음 for은 같은 동일한 값의 max가 있으면 필터링 해주기 위한 for이다.
    조건이 성립된다면 div를 ++해주고 div가 1보다 크다면 ?를 출력해주고,
    아니라면 maxApb에 입력된 정수를 c로 문자로 출력해준다.

profile
Life is a long journey. But code Should be short :)

0개의 댓글