[Leetcode] #26 정렬된 배열의 중복 값들 삭제하기

문제 요약

자세한 내용은 leetcode에서 확인

https://leetcode.com/problems/remove-duplicates-from-sorted-array/


정렬된 배열에 중복 값들을 삭제한 배열의 length 를 반환해라. 단, 새로운 배열을 만들지 않고 input으로 받은 배열을 수정해야만 한다. 


예제

input: [1, 1, 1, 2, 2, 3]

output: 3 (배열의 길이), [1, 2, 3, ...] 

input 배열을 수정하고 새로운 배열의 길이를 반환하면 알아서 새로운 배열의 길이 만큼만 인식하고 그 뒤에 것들은 무시한다. 


 

풀이

two pointer 개념의 문제.

포인터 1은 전 유니크한 숫자의 인덱스. 0부터 시작.

포인터 2는 새로운 숫자의 인덱스. 배열의 0번째 숫자는 변하지 않기 때문에 1부터 시작한다.


for loop를 사용하여 배열을 돌면서 포인터 1 (i)포인터 2 (j)의 배열 숫자가 다를 경우 i+1 인덱스에 nums[j] (새로운 숫자)의 값을 넣어준다. 



public int removeDuplicates(int[] nums) {
// 배열이 empty 일 경우 바로 리턴
if (nums.length == 0) return 0;
// i = 포인터 1
// j = 포인터 2
int i=0;
for (int j=1; j<nums.length; j++) {
// 포인터 1과 2가 가리키는 숫자가 다를 경우 i+1 인덱스에 포인터 2가 가리키는 숫자 삽입
if (nums[i] != nums[j]) {
i++;
nums[i] = nums[j];
}
}

// i는 zero 베이스이기 때문에 1을 더한 값을 리턴
return i + 1;
}