[백준 7785] https://www.acmicpc.net/problem/7785
- 이름과 옵션을 입력받는데 입력 받은 옵션이 enter면 set에 이름을 insert하고, leave면 set에서 erase를 한다.
(아래에서도 설명하겠지만, set은 순서라는 개념이 존재하지 않는 자료구조이기 때문)- set에 입력받은 이름들을 사전 역순으로 정렬을 해야 하는데 set은 순서 개념이 존재하지 않기 때문에 set에 있는 이름들을 vector로 복사해서 복사한 이름들을 정렬한 뒤 출력한다.
* Set의 구조
* Set의 내부 구조
[반복자]
- s.begin(): set의 시작이 되는 주소 값 반환
- s.end(): set의 마지막 부분에 대한 주소 값 반환
- s.rbegin(): set의 마지막 부분을 시작점으로 지정
- s.rend(): set의 첫번 째 부분을 마지막점으로 지정
- s.cbegin(): begin()과 동일하지만 const로 설정.
- s.cend(): end()와 동일하지만 const로 설정
- s.crbegin(): rbegin()과 동일하지만 const로 설정
- s.crend(): rend()와 동일하지만 const로 설정
[용량]
- s.empty(): s가 비어있다면 true, 아니면 false
- s.size(): s에 저장되어 있는 크기
- s.max_size(): s가 가질 수 있는 최대 크기
[삽입, 삭제]
- s.insert(): s에 값 삽입
- s.erase(): s에 저장된 요소 삭제
- s.swap(): s1과 s2를 서로 교환
- s.clear(): s의 요소들 전부 삭제
- s.emplace(): move()를 사용해 객체를 저장
- s.emplace_hint(): 삽입될 위치에 대한 힌트를 토대로 삽입
[여러 기능]
- s.find(): 찾는 값이 있으면 해당 위치의 iterator 반환, 아니면 s.end()반환
- s.count(): set에 저장된 요소들의 갯수 반환
- s.lower_bound(): set의 요소의 위치에 대한 iterator 반환
- s.upper_bound(): set의 요소의 위치에 대한 iterator 반환
- s.equal_range(): 해당 요소에 대한 범위(iterator) 반환
* Set의 특징
- Set은 순서라는 개념이 존재하지 않는 순열 자료구조이다.
따라서 순서가 없기 때문에 순서 상관없이 Set 내부에 저장된다.- Array, List와 마찬가지로 수정이 가능하다.
- 중복을 허용하지 않기 때문에 같은 값을 삽입하게 되면, 마지막에 삽입한 값 하나만 저장된다.
- 데이터의 존재 여부만 확인할 때 사용한다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
int main(void){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin>>N;
set<string> S; // string 값들을 저장할 set 선언
for(int i=0;i<N;i++){
string name;
string option;
cin>>name>>option;
if(option!="enter"&&option!="leave"){
continue;
} //option에 enter 또는 leave를 입력하지 않으면 입력을 받지 않음
if(option=="enter"){
S.insert(name);
// enter면 set에 데이터값 삽입
}else if(option=="leave" && S.count(name)){
S.erase(name);
// leave면 set에서 name에 해당하는 데이터값 삭제
}
}
vector<string> Member;
// 정렬을 하기 위한 vector 선언
for(const string& person:S){
Member.push_back(person);
}// set에 있는 이름들을 Member vector에 복사
sort(Member.begin(),Member.end(),greater<string>());
// Member vector에 있는 데이터들을 사전 역순으로 정렬
for(int i=0;i<Member.size();i++){
cout<<Member[i]<<'\n';
}
return 0;
}