[문제링크]
오름차순으로 정렬된 int 배열 nums에서
중복된 요소를 제거하고 중복되지 않는 요소의 수 k 반환
in-place하게 이루어져야 하고, nums의 길이는 중요하지 않음
(= 중복 요소를 뒤로 밀어도 됨)
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
let k = 0;
let len = nums.length;
for (let i = 0; i < len; i++) {
if (nums[i] !== nums[i + 1]) {
nums[k] = nums[i];
k++;
}
}
return (k);
};
드디어 3연속 배열 문제에서 효율적인 방법을 따라할 수 있게 되었다.
이전 문제와 아주 비슷한 방식으로 중복되지 않은 요소를 앞으로 당겨서 값을 바꾸는 방법이다.
모든 배열을 돌면서 지금과 다음 값이 다를 때 지금 값을 인덱스 k(0부터 시작)에 대입하고 k를 증가하면서 새 배열을 만드는 것 처럼 쌓아갔다.
중복되지 않은 요소의 개수는 k를 반환하면 끝!
Accepted
Runtime 87ms (Beats 30.30%)
Memory 43.8MB (Beats 98.59%)
사실 너무나 쉽고 또 빠르게 풀었기 때문에 특별한 배움은 없었다. 그런데 메모리 효율에 비해 런타임 효율이 많이 안좋아서 다른 사람의 풀이를 찾아보았다.
var removeDuplicates = function(nums) {
let i = 0;
for (let j = 1; j < nums.length; j++) {
if (nums[i] !== nums[j]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
거의 모든 방법이 같았지만 나는 지금의 인덱스와 다음의 인덱스를 비교하는 대신 이 사람은 내 풀이에서의 k와 배열을 순회하는 j를 비교하였다. 솔직히 비슷할거라고 생각하는데(...) 왜 인지 이 코드는 98%가 나온다. 게다가 나는 length를 따로 변수에 담아서 for문을 돌때마다 length를 체크하지도 않는데... 하지만 메모리 효율에서는 내 코드가 우세했다. 이런 이유를 찾는게 러닝 포인트겠지만 다음에 해보도록 하겠다.