입력받은 N개의 문자를 길이가 짧은 순서대로 출력한다. 길이가 동일할 경우 사전순으로 출력한다. 단, 같은 단어를 한 번만 출력한다.
테스트 케이스
13 but i wont hesitate no more no more it cannot wait im yours
i im it no but more wait wont yours cannot hesitate
문제 풀이
문제에서 제시한 규칙에 맞춰 algorithm의 sort 함수에 사용할 비교용 함수를 만들면 된다. 비교용 함수를 만들기 싫다면 문자열 길이별로 묶어서 각 길이마다 sort 하는 방식을 사용해도 된다. 출력 시에는 현재 문자열과 이전 or 다음 문자열과 비교하여 동일하지 않으면 출력하도록 한다.
풀이 코드
#include <iostream>
#include <iostream>
#include <string>
using namespace std;
// 비교함수를 만들어서 sort 하는 경우
bool cmp_1181(const string& left, const string& right)
{
if (left.length() == right.length())
{
return left < right;
}
return left.length() < right.length();
}
void BAEKJOON_1181()
{
int N;
cin >> N;
string* word = new string[N + 1];
for (int i = 0; i < N; ++i)
{
cin >> word[i];
}
sort(word, word + N, cmp_1181);
for (int i = 0; i < N; ++i)
{
if (word[i] == word[i + 1])
{
continue;
}
cout << word[i] << "\n";
}
delete[] word;
return;
}
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// length별로 그룹을 나눈 후 sort 하는 경우
void BAEKJOON_1181()
{
int N;
cin >> N;
string word;
vector<string> wordList[51];
for (int i = 0; i < N; ++i)
{
cin >> word;
wordList[word.size()].push_back(word);
}
for (int i = 0; i < 51; ++i)
{
sort(wordList[i].begin(), wordList[i].begin() + wordList[i].size());
for (auto it = wordList[i].begin(); it != wordList[i].end(); ++it)
{
if (it != wordList[i].begin())
{
if (*it == *(it - 1))
{
continue;
}
}
cout << *it << "\n";
}
}
return;
}