** 이 글을 읽음에 앞서 포스팅 된 소스가 100% 정답은 아님을 밝힙니다.
더욱 유능한 분께서 클린 / 최적의 소스를 짜셨을 가능성이 높습니다.
기록용으로 남기며, 참고만 부탁드립니다.
** 백준 알고리즘은 직접 풀이를 해보시는 것을 권장합니다.
● 문제
난이도[티어] : 브론즈 1
백준 알고리즘 1157번 단어 공부
https://www.acmicpc.net/problem/1157
● 풀이 방법
모든 문자들을 vector로 나눈 후 개수를 세어 가장 많이 사용된 알파벳을 추출.
대소문자가 섞여 있기에 모두 대문자로 만들거나 소문자로 만들어서 계산하는 방식을 사용.
● 소스 코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int main()
{
string enter_words;
vector<char> words;
char word, high_word;
int cnt = 0, high_cnt = 0;
bool eq_high_cnt = false;
cin >> enter_words;
for(int i = 0; i < enter_words.length(); i++){
words.push_back(enter_words[i]);
}
//문자열을 모두 대문자로 변환.
transform(words.begin(), words.end(), words.begin(), ::toupper);
sort(words.begin(),words.end());
for(int i = 0; i < words.size(); i++){
if(word != words[i]){
word = words[i];
cnt = 1;
}else{
cnt++;
}
if(high_cnt < cnt){
high_cnt = cnt;
high_word = word;
eq_high_cnt = false;
}else if(high_cnt == cnt){
eq_high_cnt = true;
}
}
if(eq_high_cnt)
cout << "?";
else
cout << high_word;
return 0;
}
algorithm의 라이브러리에서 transform을 사용하여 모두 대문자로 변환하는 작업과 sort를 통해 정렬하는 작업을 진행.
정렬을 통해 똑같은 단어가 순차적으로 나열이 됨.
ex) JavAScRipt → (transform) → JAVASCRIPT → (sort) → AACIJPRSTV
전체탐색을 통하여 앞글자부터 볼 때, 가장 많이 연속적으로 나온 문자의 개수를 count.
만약 가장 많이 나온 문자의 개수가 여러개 일 경우 ? 출력
transform
#include <algorithm>
template< class InputIt, class OutputIt, class UnaryOperation >
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation unary_op);
sort
#include <algorithm>
sort(container.begin(), container.end());
● 결과
** 코드 길이가 상이 할 수 있습니다! 그러나 내용물은 같습니다.
이유) 주석 및 더미 소스 유무
'백준 알고리즘 > C++17' 카테고리의 다른 글
[백준 | C/C++] 1259번 문제 풀이 : 팰린드롬수 (0) | 2024.07.02 |
---|