백준 1371 - 가장 많은 글자

2 minute read

문제링크

문제 접근

  • “입력을 어떻게 받을 것인가?” 가 중요한 문제였다. 백준의 경우 입력이 파일로 이루어지기 때문에 입력함수가 파일의 끝까지 입력을 받았다면 EOF(End of File)를 반환한다. 윈도우 커멘드창의 경우 ctrl+’z’ 를 입력해야한다.
  • string 객체를 이용했기 때문에 입력함수 std::cin 에 대해 먼저 생각해야한다. cin 입력함수의 경우 입력버퍼에 공백문자(개행, 스페이스바)를 그대로 남겨두고 그전까지 들어온 문자열에 대해서만 데이터를 입력버퍼로부터 가져온다. 따라서 이 문제의 경우 오로지 알파벳 소문자로만 이루어진 문자열만을 처리할 수 있다는 장점이 있다.
  • 입력버퍼에서 “공백으로 나누어진 문자열(단어)”들을 따로따로 접근할 수 있으므로 문자열의 각 알파벳의 개수를 센다.
  • 알파벳의 개수 중 최댓값을 찾는다. 그리고 그 최댓값을 가지는 알파벳들을 모두 출력한다.

의사코드(pseudo-code)

# define global varible
- int alpha_cnt[26] = {0, }

# define function
- int findMax()
	- max = alpha_cnt[0]
	- for i=1 to 25:
		- if max < alpha_cnt[i]: max = alpha_cnt[i]
	- return max

# main
- while true:
	- cin >> str
	- if cin.eof()==true: break
	- len = str.length()
	- for i=0 to len-1:
		- idx = str[i] - 'a'
		- alpha_cnt[idx] += 1
- max = findMax()
- for i=0 to 25:
	- if max==alpha_cnt[i]:
		- ch = i + 'a'
		- cout << ch

소스코드 및 분석

전체 코드

#include <iostream>
#include <string>

int alpha_cnt[26] = { 0, };

int findMax() {
	int max = alpha_cnt[0];
	for (int i = 1; i < 26; i++)
		if (max < alpha_cnt[i]) max = alpha_cnt[i];
	return max;
}

int main()
{
	std::string str;
	while (true) {
		std::cin >> str;
		if (std::cin.eof() == true) break;
		int len = str.length();
		for (int i = 0; i < len; i++) {
			int idx = str[i] - 'a';
			alpha_cnt[idx]++;
		}
	}
	int max = findMax();
	for (int i = 0; i < 26; i++) {
		if (max == alpha_cnt[i]) {
			char ch = i + 'a';
			std::cout << ch;
		}
	}
}
  • std::cin.eof()는 입력 버퍼에 EOF가 있다면 true 를 반환하는 함수이다. 따라서 파일의 끝에 도달했다면 반복문을 탈출하여 더 이상 입력을 받지 않는다.
  • alpha_cnt 배열을 이용해서 26개의 알파벳이 나온 횟수를 센다.
  • 아스키코드값을 이용해 배열의 인덱스와 문자 간의 관계를 정의한다.
  • alpha_cnt 배열에서 최댓값을 찾는 함수인 findMax()를 따로 정의했다. 해당 함수는 배열의 최댓값을 반환한다.
  • 최댓값을 찾고나면 최댓값을 갖는 모든 알파벳을 차례로 출력한다.

다른 풀이

#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	vector<int> alpha_cnt(26, 0);
	string str;
	while (getline(cin, str)) {
		for (int i = 0; i < str.size(); i++) {
			if(isalpha(str[i]))
				alpha_cnt[str[i]-'a']++;
		}
	}
	int max = *max_element(alpha_cnt.begin(), alpha_cnt.end());
	for (int i = 0; i < 26; i++) {
		if (max == alpha_cnt[i])
			printf("%c", i + 'a');
	}
	cout << endl;
}

Leave a comment