백준 1371 - 가장 많은 글자
문제링크
문제 접근
- “입력을 어떻게 받을 것인가?” 가 중요한 문제였다. 백준의 경우 입력이 파일로 이루어지기 때문에 입력함수가 파일의 끝까지 입력을 받았다면 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