문제 풀이/Programmers 문제 풀이

[Programmers]#Level1_배열의 원소 삭제하기, remove_if(), find(), erase()

Hardii2 2023. 11. 23. 23:14

 

[Programmers 알고리즘, C++]#Level 1_배열의 원소 삭제하기

 

Programmers 알고리즘 문제 풀이, Level1_배열의 원소 삭제하기

C++의 remove_if(), find(), 그리고 erase()를 활용하는 문제

 


 

Overview

 

  1. 문제
  2. 풀이
  3. 코드

 

#1. 문제

 

 

#2. 풀이

1. remove() + erase()

 

[Basic C++] #53_STL 알고리즘, remove + erase, 옮기고 삭제하기

[Basic C++] #53_STL 알고리즘, remove + erase, 옮기고 삭제하기 STL 알고리즘 중 "remove 알고리즘"에 대해 알아보겠습니다. "전문가를 위한 C"의 17 항목, "STL 알고리즘 마스터하기"에 해당하는 내용입니다. r

webddevys.tistory.com

 

  • [개념] : 대부분의 STL 컨테이너들은 특정 항목을 erase() 함수를 통해 삭제할 수 있습니다. 다만, erase() 함수를 바로 호출하는 것은 대부분 비효율적입니다. 배열 자료구조의 단점은 처음과 끝에 위치한 항목이 아니라면, 해당 항목의 삭제는 기존 항목들을 이동시키는 작업이 필요합니다.
  • [remove/remove_if] : remove() 혹은 remove_if() 알고리즘은 컨테이너 내 Predicate 조건과 합치하는 항목들과 불 합치하는 항목들을 분할하고, 합치하지 않는 항목들 중 첫 번째 항목을 가리키는 반복자를 반환합니다. 결과적으로, remove/remove_if 알고리즘의 반환 값을 시작으로 end()까지의 항목들을 erase() 해주면 우리가 원하는 삭제 작업을 수행할 수 있습니다!

 

2. remove_if() + erase()

  1. 먼저, remove_if 알고리즘을 활용해 주어진 vector 컨테이너 내 삭제해야할 항목들을 찾아서 컨테이너의 뒤로 이동시킵니다. 
  2. remove_if의 Predicate 함수는 람다 함수 표현식을 활용합니다. 이 람다 함수는 vector 컨테이너의 각 항목마다 find()함수를 호출하여 delete_list에 존재하는지 확인하고 그 결과 값을 반환합니다.
  3. 마지막으로, 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;
}