[백준알고리즘] 1157번: 단어 공부 -C++
먼저, 문제를 풀면서 toupper, tolower 함수를 알았다.
원래는 C언어에도 있던 함수로 char를 인자로 해서 각각 대문자, 소문자로 변환해주는 함수로 <cctype> 헤더에 있다고 한다. C언어에 있었는데 왜 몰랐지...
아무튼, 하지만 <algorithm> 헤더에 포함이 되어 있는지, 따로 추가를 해주지 않아도 코드가 동작했다.
(이 부분은 혹시 아시는 분 계시면 알려주세요 ㅠ)
하지만 char 하나씩 변환하면서 반복문 돌리는 거보다 transform 쓰는 게 깔끔해 보여서 transform을 썼다. iterator로 시작점과 끝점을 정해주고, 덮어쓸 위치를 시작 위치로 잡아주었다. 결과는 대문자로 출력하기에 모든 문자를 대문자로 변환시켜주었다.
그리고 이제는 카운팅 해서 유일한 최대 사용 알파벳이 있으면 출력해주고, 같은 횟수로 여러 알파벳을 최대로 사용했다면 ?를 출력하도록 3항 연산자를 사용했다.
#include <iostream>
#include <string>
#include <algorithm>
int main(void)
{
std::string word;
std::cin >> word;
const uint8_t ALPHA = 26;
int alphabet[ALPHA] = { 0 };
std::transform(word.begin(), word.end(), word.begin(), toupper);
for (char c : word)
alphabet[c - 'A'] += 1;
bool MULTI_MAX = false;
int max_count = -1;
int max_index = -1;
for (int i = 0; i < ALPHA; i++)
{
int count = alphabet[i];
if (max_count > count) continue;
if (max_count == count)
{
MULTI_MAX = true;
continue;
}
max_count = count;
max_index = i;
MULTI_MAX = false;
}
std::cout << (MULTI_MAX ? '?' : char(max_index + 'A'));
return 0;
}
여기서 사실 Priority Queue나 Max Heap을 사용하고 싶었는데, 찾아보기 오래 걸릴 것 같아 안 했었다.
그래서 지금 또 하고 있다...
transform()이 <algorithm> 헤더에 있다고 추가를 해줬었는데 왜인지 빼줬는데도 된다..?
아무튼 priority_queue<>를 사용해 우선순위 큐를 만들어 주었다. tuple로 하려고 했는데 두 쌍으로 구성되면 pair, 더 많은 원소를 쌍으로 정의하면 tuple로 확장되는 것 같다.
그래서 pair로 알파벳의 사용순서와 알파벳을 묶었다.
가장 많이 쓰인 알파벳을 두 개 뽑아서 사용된 횟수를 비교함으로써 같은 횟수의 최대 사용 횟수가 있는지 확인했다.
pair나 tuple를 return 받을 때에는 tie()를 쓰는 것 같다.
작성하면서 느꼈지만, 다시 한 번 auto와 IDE의 힘이 대단한 것 같다.. 계속 tuple 쓸뻔한 걸 이 친구들이 알려주었다..
#include <iostream>
#include <string>
#include <queue>
int main(void)
{
std::string word;
std::cin >> word;
const uint8_t ALPHA = 26;
int alphabet[ALPHA] = { 0 };
std::transform(word.begin(), word.end(), word.begin(), toupper);
for (char c : word)
alphabet[c - 'A'] += 1;
// default less<> -> MAX HEAP
std::priority_queue<std::pair<int, char>> pq;
for (int i = 0; i < ALPHA; i++)
{
std::pair<int, char> node(alphabet[i], char(i + 'A'));
pq.push(node);
}
int max_count; char max_alpha;
std::tie(max_count, max_alpha) = pq.top();
pq.pop();
int second_count; char second_alpha;
std::tie(second_count, second_alpha) = pq.top();
std::cout << ((max_count == second_count) ? '?' : max_alpha);
return 0;
}
잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다
'algorithm > 백준알고리즘' 카테고리의 다른 글
[백준알고리즘] 2908번: 상수 -C++ (0) | 2021.01.16 |
---|---|
[백준알고리즘] 1152번: 단어의 개수 -C++ (0) | 2021.01.16 |
[백준알고리즘] 2675번: 문자열 반복 -C++ (0) | 2021.01.11 |
[백준알고리즘] 10809번: 알파벳 찾기 -C++ (0) | 2021.01.11 |
[백준알고리즘] 11720번: 숫자의 합 -C++ (0) | 2021.01.11 |