문제
https://www.acmicpc.net/problem/1181
설명
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
bool compare(string a, string b)
{
if(a.size()==b.size())
{
return a<b;
}
else return a.size()<b.size();
}
int main()
{
int N;
vector<string> words;
cin>>N;
for(int i = 0; i<N;i++)
{
string tmp;
cin>>tmp;
words.push_back(tmp);
}
sort(words.begin(), words.end(), compare);
words.erase(unique(words.begin(), words.end()),words.end());
for(int i = 0; i<words.size();i++)
{
cout<<words[i]<<endl;
}
}
4번만에 맞았다!!
처음에는 중복된 값을 제거하지 않아서 틀렸다.
두번째에는 unique를 사용하고, 출력은 그대로 N으로 해서 틀렸다.
세번째에는 출력 범위만 words.size()로 수정해서 틀렸다.
마지막에는 unique에 erase까지 추가해서 맞을 수 있었다.
이 문제에서 공부한 것은 sort함수를 사용할때 정렬하는 기준을 만드는 함수 구현, 벡터에서 중복제거 이렇게 두가지 이다.
sort함수에서 정렬하는 기준으로 사용할 함수의 return값은 bool type 이다.
나는 문자열의 길이가 같으면 사전순으로, 같지 않으면 길이순으로 정렬하도록 함수를 구현하였다.
bool compare(string a, string b)
{
if(a.size()==b.size())
{
return a<b;
}
else return a.size()<b.size();
}
벡터의 중복제거
unique가 끝났으면 반환되는값은 vector의 쓰레기값의 첫번째 위치이다.
erase함수에는 삭제할 처음위치와 마지막위치를 인자로 갖는다.
따라서 unique함수를 실행한 결과와, 벡터의 마지막 위치를 erase함수의 인자로 넣어주면 중복된 원소들이 제거된다!
words.erase(unique(words.begin(), words.end()),words.end());
반응형
'알고리즘 문제 > C++' 카테고리의 다른 글
[백준] 23061번 : 백남이의 여행 준비 - C++ (0) | 2022.04.26 |
---|---|
[백준] 23057번 : 도전 숫자왕 - C++ (0) | 2022.04.26 |
[백준] 2606번: 바이러스(DFS) - C++ (2) | 2022.03.09 |
[백준] 2606번: 바이러스(BFS) - C++ (0) | 2022.03.09 |
[백준] 2667번: 단지번호붙이기(DFS) - C++ (0) | 2022.03.08 |