[문제 링크]
오름차순 정렬된 int 배열 nums
중복된 요소를 최대 2개까지만 남기고 삭제
최종적으로 남게되는 요소의 개수 k 반환
in-place하게 배열을 바꿀 것
이전 문제와 동일한 방식이며 중복 허용이 2개까지 가능해짐
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
let len = nums.length;
let k = 1;
for (let i = 2; i < len; i++) {
if (nums[k - 1] !== nums[i]) {
k++;
nums[k] = nums[i];
}
}
return (k + 1);
};
이전 문제에서 다른 사람의 풀이를 보고 알게된 방식을 사용해보았다.
k는 현재 저장되고 있는 인덱스 겸 길이 반환용 변수다.
한 번의 중복이 가능하므로 배열을 돌면서 k - 1과 같지 않으면 k번째에 값을 대입하는 방법이다.
첫 값과 두번째 값은 무조건 저장될 것이기 때문에 i=2부터 탐색하였다.
k번째 인덱스까지 값이 저장되었으므로 길이는 k + 1을 반환해준다.
Accepted
Runtime 66ms (Beats 74.30%)
Memory 43.5MB (Beats 96.99%)
꽤 좋은 결과와 한 번의 시도에 통과했기 때문에 따로 깨닫게 된 점은 없다. 다만 이전의 방식이 이번 문제와 잘 맞았다는 것과, 그것을 활용할 수 있었다는 점이 뿌듯하고 문제를 계속 풀면서 발전해나가고 있는 것 같아 안심이 된다. 그래도 다른 사람의 풀이를 보긴 했는데, 핵심 알고리즘과 관련된 내용은 아니지만 배워간게 있어 적어보려 한다.
const removeDuplicates = function (nums) {
if (!nums.length) return 0;
let k = 0;
for (let i = 0; i < nums.length; i++) {
if (k < 2 || nums[i] > nums[k - 2]) {
nums[k] = nums[i];
k++;
}
}
return k;
};
바로 이 코드인데, 주어지는 함수 템플릿의 선언을 const로 바꾼 점과 길이가 0인 배열이 입력값으로 들어올 수 있어 예외처리를 한 부분이 매우 인상 깊었다. 이렇게 조그만 부분이더라도 잘 챙겨서 처리해둔다면 다양한 입력값을 사용하는 테스트에서도 유연히 통과할 수 있을 것이라 생각한다.