[Programmers 알고리즘, C++]#Level 1_배열의 원소 삭제하기
Programmers 알고리즘 문제 풀이, Level1_배열의 원소 삭제하기
C++의 remove_if(), find(), 그리고 erase()를 활용하는 문제
Overview
- 문제
- 풀이
- 코드
#1. 문제
#2. 풀이
1. remove() + erase()
- [개념] : 대부분의 STL 컨테이너들은 특정 항목을 erase() 함수를 통해 삭제할 수 있습니다. 다만, erase() 함수를 바로 호출하는 것은 대부분 비효율적입니다. 배열 자료구조의 단점은 처음과 끝에 위치한 항목이 아니라면, 해당 항목의 삭제는 기존 항목들을 이동시키는 작업이 필요합니다.
- [remove/remove_if] : remove() 혹은 remove_if() 알고리즘은 컨테이너 내 Predicate 조건과 합치하는 항목들과 불 합치하는 항목들을 분할하고, 합치하지 않는 항목들 중 첫 번째 항목을 가리키는 반복자를 반환합니다. 결과적으로, remove/remove_if 알고리즘의 반환 값을 시작으로 end()까지의 항목들을 erase() 해주면 우리가 원하는 삭제 작업을 수행할 수 있습니다!
2. remove_if() + erase()
- 먼저, remove_if 알고리즘을 활용해 주어진 vector 컨테이너 내 삭제해야할 항목들을 찾아서 컨테이너의 뒤로 이동시킵니다.
- remove_if의 Predicate 함수는 람다 함수 표현식을 활용합니다. 이 람다 함수는 vector 컨테이너의 각 항목마다 find()함수를 호출하여 delete_list에 존재하는지 확인하고 그 결과 값을 반환합니다.
- 마지막으로, remove_if가 반환한 반복자 ~ end() 구간을 erase() 함수의 인자로 전달하여, 배열 내 원소들을 삭제합니다.
#3. 코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr, vector<int> delete_list) {
vector<int> answer;
auto it = remove_if(begin(arr), end(arr),
[&delete_list](const int& delete_num){
return find(begin(delete_list), end(delete_list), delete_num) != end(delete_list);
});
arr.erase(it, end(arr));
answer = arr;
return answer;
}
'문제 풀이 > Programmers 문제 풀이' 카테고리의 다른 글
[Programmers_C++]#Level2_구명보트, 투 포인터 알고리즘 (0) | 2023.12.13 |
---|---|
[Programmers]#Level2_가장 큰 수, sort(), 람다 함수 (1) | 2023.11.23 |
[Programmers]#Level1_체육복, map, prev(), next() (0) | 2023.11.23 |
[Programmers]#Level2_모음 사전, 완전 탐색, DFS(깊이 우선 탐색) (1) | 2023.11.23 |
[Programmers]#Level3_이중 우선 큐, set, multiset (0) | 2023.11.23 |