백준 1157번 (단어 공부, C++, 문자열) [BAEKJOON]

단어 공부

https://www.acmicpc.net/problem/1157

시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초128 MB204015809136429139.417%

문제

알파벳 대소문자로 된 단어가 주어지면,

이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오.

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

입력

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

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

출력

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

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

예제 입력 1

Mississipi

예제 출력 1

?

예제 입력 2

zZa

예제 출력 2

Z

예제 입력 3

z

예제 출력 3

Z

예제 입력 4

baaa

예제 출력 4

A

출처

알고리즘 분류


이 문제를 해결하려면 ASCII 코드에 대해서 알아야 한다.

ASCII Table – American Standard Code for Information Interchange Table

알파벳의 개수 26만큼 배열을 선언한다. (배열의 값은 해당 알파벳의 개수)

문제의 문자열을 인덱스로 순회하면서 대문자/소문자에 관계없이 알파벳 배열에 개수를 추가한다.

인덱스를 순회하며 가장 큰 값을 찾고

배열을 오름차순으로 정렬한 뒤에 0번과 1번 인덱스를 비교한다.

만약 값이 같다면 최대 개수가 같은 알파벳이 있다는 뜻으로 ? 를 출력한다.

문제의 포인트는 대문자/소문자에 관계없이 알파벳의 개수를 체크,

가장 많은 알파벳 찾을 찾아 출력하기,

최댓값 중복에 대한 예외 처리 인 것 같다.

통과된 코드

#include <iostream>
#include <algorithm>

using namespace std;

string str;

int arr[26]; // 알파벳의 개수는 26개

int main()
{
	// 문제의 문자열을 받는다.
	cin >> str;

	for (int i = 0; i < str.length(); i++) {
		if (str[i] >= 97) 	arr[(str[i] - 32) - 'A']++; // 소문자
		else arr[str[i] - 'A']++; // 대문자
	}

	// 가장 많이 사용한 알파벳을 찾는다.
	int maxIndex = -1;
	int max = -1;
	for (int i = 0; i < 26; i++) {
		if (max < arr[i]) {
			max = arr[i];
			maxIndex = i;
		}
	}

	// 가장많이 사용한 알파벳을 출력한다.
	sort(arr, arr + 26, greater<int>()); // 내림차순 정렬

	// 0번과 1번이 같다면 가장 많이 사용된 알파벳이 한개가 아니라는 의미 
	if (arr[0] == arr[1]) {
		cout << "?"; 
	}
	else { 
		char ch = maxIndex + 'A'; 
		cout << ch;
	} 

	return 0;
}

문제를 풀고 다른 사람들이 작성한 코드를 보니 ASCII 코드를 사용하는 방법은 아래가 더 좋은 것 같다.

https://rujang.tistory.com/entry/%EB%B0%B1%EC%A4%80-1157%EB%B2%88-%EB%8B%A8%EC%96%B4-%EA%B3%B5%EB%B6%80-C

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤