문제
앞서 STL 자료구조인 Set 을 배웠다.
실전 문제들에서는 Set 못지않게 Multiset 도 많이 쓰인다.
Multiset 은, Set 과는 달리 "중복 원소들도 허용" 한다.
S.insert(1) 을 5번 실행하면,
S 가 Set 일 때는 중복을 허용하지 않아 S = { 1 } 이지만,
S 가 Multiset 일 때는 중복을 허용하여 S = { 1, 1, 1, 1, 1 } 이 된다.
Set 과 Multiset 은 함수들의 사용 방법이 똑같지만, Multiset 에서는 erase() 함수를 조심해야 한다.
Multiset MS = { 1, 1, 2, 2, 2 } 라고 하자.
MS.erase(2) 를 하면, MS 에 있는 2 를 "모두 제거"해버린다. 따라서 MS = { 1, 1 } 이 된다.
만약 2 를 '하나만' 지우고 싶다면, 2의 위치를 erase 함수에 넣어주어야 한다.
즉, MS.erase(MS.find(2)) 를 해주면, 2 가 한 번만 제거된다.
하지만, MS 에 2 가 들어있지 않았다면, MS.find(2) 는 MS.end() 를 반환하고, 이를 erase() 함수에 넣으면 런타임 에러가 발생한다.
따라서, 항상 안전하게
if(MS.find(2) != MS.end()){
ㅤㅤ MS.erase(MS.find(2));
}를 해주는 식으로 먼저 존재 여부를 검사하자.
연습문제
정수형 자료를 저장할 수 있는 multiset 을 선언한 후, 다음 2가지 작업을 순서대로 처리한 후에 남아있는 자료를 오름차순으로 출력하는 프로그램을 작성하라
i □ : □를 집합에 추가한다.
r □ : 집합 내에 □가 있다면 "하나만" 삭제한다. 없으면 아무 일도 하지 않는다.
e □ : 집합 내에 □가 있다면, □ 를 "전부" 삭제한다. 없으면 아무 일도 하지 않는다.
반드시 지금 배운 multiset 을 사용한다.
multiset <int> S;ㅤ의 형식으로 선언하면 된다.
입력
첫 줄에 작업의 개수 Q 가 입력된다. ( 1 ≤ Q ≤ 100,000 )
다음 Q 줄에 걸쳐, 위 형식에 맞는 작업이 주어진다. 이때 원소로써 주어지는 정수는 -10억 이상, 10억 이하이다.
출력
모든 작업이 순서대로 끝난 후 multiset에 남아 있는 원소를 오름차순으로 출력한다.
예제
12
i 1
i 1
i 1
i 2
i 2
r 1
r 3
e 2
e 3
i 2
i 2
i 2
1 1 2 2 2