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이라는 값을 가진 요소가 제거된다.