inblog logo
|
jjack1
    Java프로그래머스코딩테스트

    [프로그래머스] 109. 배열의 원소 삭제하기

    최재원's avatar
    최재원
    Jul 18, 2026
    [프로그래머스] 109. 배열의 원소 삭제하기
    💡

    문제 설명

    정수 배열 arr과 delete_list가 있습니다. arr의 원소 중 delete_list의 원소를 모두 삭제하고 남은 원소들은 기존의 arr에 있던 순서를 유지한 배열을 return 하는 solution 함수를 작성해 주세요.
    💡

    제한사항

    • 1 ≤ arr의 길이 ≤ 100
    • 1 ≤ arr의 원소 ≤ 1,000
    • arr의 원소는 모두 서로 다릅니다.
    • 1 ≤ delete_list의 길이 ≤ 100
    • 1 ≤ delete_list의 원소 ≤ 1,000
    • delete_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
    • 예제 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(); } }
    notion image
     

    순수 배열 + 이진탐색

    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); } }
    notion image
     

    클로드 해설

    이론상 탐색 횟수 기준으로만 보면:
    • Set.contains → 해시값 계산 후 바로 접근 → O(1)
    • 이진탐색 → 절반씩 줄여가며 여러 번 비교 → O(log n)
    그래서 이론상 Set이 빠르다고 하는 겁니다.

    하지만 실제로 느린 이유는:
    • int → Integer 박싱 비용
    • stream().boxed().collect() 변환 비용
    • 해시 계산 및 버킷 접근 비용
    이진탐색은 int[] 그대로 써서 이런 오버헤드가 전혀 없기 때문에 실제 성능은 더 빠릅니다.
    즉 이론은 순수 탐색 횟수, 실제는 총 처리 비용 기준이라 결과가 다릅니다.
    Share article

    jjack1

    RSS·Powered by Inblog