
정수 배열 arr과 delete_list가 있습니다. arr의 원소 중 delete_list의 원소를 모두 삭제하고 남은 원소들은 기존의 arr에 있던 순서를 유지한 배열을 return 하는 solution 함수를 작성해 주세요.
arr의 길이 ≤ 100arr의 원소 ≤ 1,000arr의 원소는 모두 서로 다릅니다.delete_list의 길이 ≤ 100delete_list의 원소 ≤ 1,000delete_list의 원소는 모두 서로 다릅니다.| arr | delete_list | result |
|---|---|---|
| [293, 1000, 395, 678, 94] | [94, 777, 104, 1000, 1, 12] | [293, 395, 678] |
| [110, 66, 439, 785, 1] | [377, 823, 119, 43] | [110, 66, 439, 785, 1] |
입출력 예 #1
arr의 원소 중 1000과 94가 delete_list에 있으므로 이 두 원소를 삭제한 [293, 395, 678]을 return 합니다.입출력 예 #2
arr의 원소 중 delete_list에 있는 원소는 없습니다. 따라서 arr 그대로인 [110, 66, 439, 785, 1]을 return 합니다.이 문제는 arr 내부의 원소 중 delete_list에 포함된 값을 제거하고, 나머지는 기존 순서를 유지한 채 반환하는 단순한 필터링 문제다. 핵심은 두 가지로 요약된다.
이를 JavaScript에서 구현할 때 가장 적합한 도구는 Set과 Array.prototype.filter이다. 두 개념을 명확히 이해하면 코드가 왜 이러한 구조를 취하는지 자연스럽게 파악된다.
Set은 중복을 허용하지 않는 데이터 집합을 저장하는 자료구조로, 특정 값이 포함되어 있는지 판별하는 연산이 평균적으로 O(1)의 시간에 수행된다. 배열에서 동일한 작업을 할 경우 includes를 사용해야 하고, 이는 매번 O(n) 탐색이 필요하므로 전체 성능이 저하된다.
이 문제에서는 삭제해야 할 값들을 Set에 담아두고 has 메서드로 빠르게 포함 여부를 확인하는 전략이 가장 적합하다.
const toDelete = new Set(delete_list);
위 코드는 삭제 대상 목록을 Set으로 변환한다. 이후 toDelete.has(value)는 value가 삭제 대상에 포함되면 true, 포함되지 않으면 false를 반환한다.
filter는 배열을 처음부터 끝까지 순회하며, 콜백 함수가 true를 반환할 때만 해당 값을 결과 배열에 포함한다. 원본 배열을 직접 수정하지 않고, 조건을 만족하는 값들만 모아 새로운 배열을 생성한다는 점에서 선언적이고 명료한 방식이다.
형식은 다음과 같다.
arr.filter(value => 조건식);
조건식이 true일 때 value는 유지되고, false일 때는 제거된다.
이 문제에서의 조건은 단순하다.
"삭제 대상에 포함되어 있지 않은 값만 남긴다."
따라서 조건식은 !toDelete.has(value)가 된다.
function solution(arr, delete_list) {
const toDelete = new Set(delete_list);
return arr.filter(value => !toDelete.has(value));
}
예제 1을 기준으로 실제 동작을 표로 정리하면 다음과 같다.
arr = [293, 1000, 395, 678, 94]
toDelete = new Set([94, 777, 104, 1000, 1, 12])
| 값 | toDelete.has(value) | 유지 여부 |
|---|---|---|
| 293 | false | 유지 |
| 1000 | true | 제거 |
| 395 | false | 유지 |
| 678 | false | 유지 |
| 94 | true | 제거 |
결과는 [293, 395, 678]이 된다.
includes 사용arr.filter(value => !delete_list.includes(value));
문제의 입력 규모에서는 정상적으로 동작하지만, 삭제 대상 목록이 커지면 반복적으로 전체 배열을 탐색해야 하므로 효율성이 떨어진다.
const toDelete = new Set(delete_list);
arr.filter(value => !toDelete.has(value));
삭제 대상 여부를 확인하는 연산이 상수 시간에 이루어지므로 더 안정적이며, 특히 입력 크기가 커지는 환경에서는 필수에 가깝다.
Set은 삭제 대상 목록을 빠르게 조회하기 위한 최적의 자료구조다.filter는 조건 기반 요소 추출에 적합한 선언적 API다.