정수형 배열에서 특정 값을 삭제해야 한다는 점에서 여러 방법이 생각났다.
List 로 변환한 다음, 실제 값을 삭제한다.그런데, 전자의 경우 정수형 배열에서 굳이 문자형 타입의 값으로 치환해야 한다는 점이 번거롭다.
-1 로 치환하면 되지 않냐? 는 생각이 떠오를 수도 있는데, 굳이? 이다.그리고 후자의 경우, 정수형 배열 속 모든 원소를 순회해야 한다는 점에서 실제 값을 삭제할 수 없다.
Index bound of Exception 이 발생할 수 있기 때문이다.그럼 어떤 방법이 좋을까?
유효한 원소들만 골라 세면되지 않을까? 란 생각을 하게 됐다.
투 포인터는 말 그대로 배열에 두 개의 인덱스를 사용하는 것이다.
순회용, 하나는 유효한 원소의 개수를 나타낼 용도다.searchIndex 와 keepIndex 라고 하겠다.keepIndex 란 말이 좀 헷갈릴 수도 있는데, 직관적으로 유효한 원소의 위치를 가리키기 위함이다.먼저 searchIndex 의 경우, 정말 배열을 순회만 하면 된다.
그리고, keepIndex 의 역할은 다음과 같다.
- int nums[searchIndex] 값이 val 일 경우,
- nums[searchIndex] 값이 val 이 아닐 경우,
이를 반복하면, nums 에는 왼쪽에서부터(즉, index = 0 부터) 차례대로 유효한 원소가 쌓이는 형태를 갖추게 된다.
그리고, keepIndex 는 차례대로 유효한 원소를 셀 때마다 증가했으므로 최종적으로 유효한 원소의 개수 그 자체를 저장하고 있다.
이를 반환하면 된다.
class Solution {
public int removeElement(int[] nums, int val) {
int result = 0;
int keepIndex = 0;
for (int searchIndex = 0; searchIndex < nums.length; searchIndex ++) {
if (nums[searchIndex] == val) continue;
nums[keepIndex] = nums[searchIndex];
keepIndex ++;
}
result = keepIndex;
return result;
}
}
searchIndex 가 유효하지 않은 원소 - 즉, val 을 만났을 때 어떤 행위를 해야 하는지? 와 유효한 원소를 만났을 때, keepIndex 의 값을 어떻게 활용해야 하는지? 가 keypoint 인 것 같다.