Description
- 처음에 문제를 잘못 이해해서 다시 푸느라 오래걸린 문제였다.
- input으로 배열이 주어졌을 때 중복된 원소를 제외한 원소들의 수를 리턴하는 문제인 줄 알았는데. 중복을 제외한 원소들의 nums만큰 기존원소를 잘라서 채점하게 되므로 자리 바꿈이 필요한 문제였다.
- 예를들어
- [0, 0, 1, 1, 1, 2, 2, 3, 3, 4] 가 주어지면 => 0,1,2,3,4가 있으므로 5가 return되야하고 기존배열도 앞부분을 [0, 1, 2, 3, 4, 2, 2, 3, 3, 4] 로 바꿔 주어야 한다.
- 즉 중복되지 않는 원소들의 갯수도 고려해야하고 기존배열의 자리도 바꿔줘야하는 것 이었다.
- 문제를 푸는 여러 방법이 있겠지만 일단 메모리 공간의 효율을 생각해서 새 배열은 만들지 않는 쪽으로 풀어보았다.
Code
1. 반복문 for문 돌면서 구현
function removeDuplicates1(nums) {
let tmpPos = 0;
for(let cur = 0; cur < nums.length; cur++) {
if(nums[tmpPos] !== nums[cur]) {
tmpPos++;
nums[tmpPos] = nums[cur];
}
}
return ++tmpPos
}
2. 고차원 함수 reduce 로 구현
function removeDuplicates2(nums) {
if (!nums.length) {
return 0
}
let tmpPos = 0;
let count = nums.reduce((acc, cur, idx, arr) => {
if (arr[tmpPos] !== cur) {
acc++;
arr[++tmpPos] = cur;
}
return acc
}, 1);
return count;
}