입출력 예
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
- 예제 1번의
arr의 원소 중 1000과 94가delete_list에 있으므로 이 두 원소를 삭제한 [293, 395, 678]을 return 합니다.
입출력 예 #2
- 예제 2번의
arr의 원소 중delete_list에 있는 원소는 없습니다. 따라서arr그대로인 [110, 66, 439, 785, 1]을 return 합니다.
코드
import java.util.*;
import java.util.stream.*;
class Solution {
public int[] solution(int[] arr, int[] delete_list) {
Set<Integer> deleteSet = Arrays.stream(delete_list)
.boxed()
.collect(Collectors.toSet());
return Arrays.stream(arr)
.filter(n -> !deleteSet.contains(n))
.toArray();
}
}
순수 배열 + 이진탐색
import java.util.Arrays;
class Solution {
public int[] solution(int[] arr, int[] delete_list) {
Arrays.sort(delete_list);
int[] temp = new int[arr.length];
int idx = 0;
for (int n : arr) {
if (Arrays.binarySearch(delete_list, n) < 0) {
temp[idx++] = n;
}
}
return Arrays.copyOf(temp, idx);
}
}
클로드 해설
이론상 탐색 횟수 기준으로만 보면:
Set.contains→ 해시값 계산 후 바로 접근 → O(1)
- 이진탐색 → 절반씩 줄여가며 여러 번 비교 → O(log n)
그래서 이론상 Set이 빠르다고 하는 겁니다.
하지만 실제로 느린 이유는:
int→Integer박싱 비용
stream().boxed().collect()변환 비용
- 해시 계산 및 버킷 접근 비용
이진탐색은
int[] 그대로 써서 이런 오버헤드가 전혀 없기 때문에 실제 성능은 더 빠릅니다.즉 이론은 순수 탐색 횟수, 실제는 총 처리 비용 기준이라 결과가 다릅니다.
Share article