[C++] 백준 7785 - 회사에 있는 사람

메르센고수·2023년 8월 18일
0

Baekjoon

목록 보기
20/48
post-thumbnail

문제 - 회사에 있는 사람 (Silver 5)

[백준 7785] https://www.acmicpc.net/problem/7785

풀이 전략

  • 이름과 옵션을 입력받는데 입력 받은 옵션이 enter면 set에 이름을 insert하고, leave면 set에서 erase를 한다.
    (아래에서도 설명하겠지만, set은 순서라는 개념이 존재하지 않는 자료구조이기 때문)
  • set에 입력받은 이름들을 사전 역순으로 정렬을 해야 하는데 set은 순서 개념이 존재하지 않기 때문에 set에 있는 이름들을 vector로 복사해서 복사한 이름들을 정렬한 뒤 출력한다.

참고

Set


* 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의 특징

  1. Set은 순서라는 개념이 존재하지 않는 순열 자료구조이다.
    따라서 순서가 없기 때문에 순서 상관없이 Set 내부에 저장된다.
  2. Array, List와 마찬가지로 수정이 가능하다.
  3. 중복을 허용하지 않기 때문에 같은 값을 삽입하게 되면, 마지막에 삽입한 값 하나만 저장된다.
  4. 데이터의 존재 여부만 확인할 때 사용한다.

소스 코드

#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;
}

결과

profile
블로그 이전했습니다 (https://phj6724.tistory.com/)

0개의 댓글