Skip to main content

60. [Java] 배열의 원소 삭제하기

https://school.programmers.co.kr/learn/courses/30/lessons/181844

  • 정수 배열 arr과 delete_list가 있다.
  • arr의 원소 중 delete_list의 원소를 모두 삭제하고 남은 원소들은 기존의 arr에 있던 순서를 유지한 배열을 return

  • 1 ≤ arr의 길이 ≤ 100
  • 1 ≤ arr의 원소 ≤ 1,000
  • arr의 원소는 모두 서로 다르다.
  • 1 ≤ delete_list의 길이 ≤ 100
  • 1 ≤ delete_list의 원소 ≤ 1,000
  • delete_list의 원소는 모두 서로 다르다.

정답코드

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int[] delete_list) {
        // int[]를 list로 바꾸기
        List<Integer> list = new ArrayList<>();
        for (int n : arr) {
            list.add(n);
        }
        
        // list에서 delete_list에 있는 요소만 삭제하기
        for (int del : delete_list) {
            // int → Integer로 명시해야 인덱스가 아닌 값이 제거됨
            list.remove(Integer.valueOf(del));
        }
        
        // list를 int[]로 바꾸기
        int[] answer = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}
​✅ List.remove(); 메서드의 두 가지 버전

List에는 아래 두 가지 메서드가 있다.

1. remove(int index);
→ 해당 인덱스의 요소를 제거한다.

2. remove(Object o);
→ 해당 객체(값)을 리스트에서 제거한다.

// 인덱스 2번 요소 제거
list.remove(2);
// 값 40 제거
list.remove(Integer.valueOf(40));

이 문제에서는 2번 방식인 Integer.valueOf(del)을 쓴다.

자바에서 정수형 List는 List<Integer> 타입이다. 근데 만약 remove(1000) 처럼 쓰면, 자바는 이걸 index = 1000으로 착각해서 remove(int index) 를 호출하려고 한다. 그래서 존재하지 않는 인덱스라면 IndexOutOfBoundsException이 발생한다.

안전하게 값을 지우고 싶다면 아래와 같이 써야 한다.

list.remove(Integer.valueOf(1000));
  • Integer.valueOf(1000) → Integer 객체 생성
  • remove(Object o) 버전이 호출됨
  • 리스트에서 1000이라는 값을 가진 요소가 제거된다.