반응형
https://www.acmicpc.net/problem/1157
문자열을 입력 받은 후, 해당 문자열에 가장 많이 포함된 alphabet을 구하는 문제다.
map에 각 alphabet별 개수를 저장 해 두고, 개수를 기준으로 오름차순으로 정렬하여 0번째, 1번째 item이 같은 개수를 가지면 ?를 출력하고, 아닐 경우 0번째 item을 출력하도록 구현하였다.
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
#include <vector>
// pair의 second value를 기준으로 sort하는 template 구조체 선언
template<template <typename> class P = std::less >
struct compare_pair_second {
template<class T1, class T2> bool operator() (const std::pair<T1, T2> &left, const std::pair<T1, T2> &right)
{
return P<T2>()(left.second, right.second);
}
};
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cout.tie(NULL);
// map 선언 & alphabet을 key값으로 초기화.
std::map<char, int> M;
for(int idx = 0; idx < 27; idx++)
{
M.insert(std::make_pair('A' + idx, 0));
}
// input으로 string을 받고, 그 string을 전부 대문자로 변환
std::string S;
std::cin >> S;
std::transform(S.begin(), S.end(), S.begin(), ::toupper);
int sLen = static_cast<int>(S.length());
// map에 string alphabet별 개수 count
for(int idx = 0; idx < sLen; idx++)
{
M[S[idx]]++;
}
// map의 item을 vector로 변환 & pair의 second를 내림차순으로 sort
std::vector<std::pair<char, int> > V(M.begin(), M.end());
std::sort(V.begin(), V.end(), compare_pair_second<std::greater>());
// top item과 next item 비교 & 결과에 따라 출력
if (V[0].second == V[1].second)
std::cout << '?';
else
std::cout << V[0].first;
return 0;
}
'Development. > Problem solving.' 카테고리의 다른 글
[BAEKJOON] 2468 - 안전 영역 (0) | 2020.08.17 |
---|---|
[BAEKJOON] 1316 - 그룹 단어 체커 (0) | 2020.08.17 |
[BAEKJOON] 2675 - 문자열 반복 (0) | 2020.08.17 |
[BAEKJOON] 4963 - 섬의 개수 (0) | 2020.08.17 |
[BAEKJOON] 2884 - 알람 시계 (0) | 2020.08.17 |