일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- ES6
- 보안뉴스 한줄요약
- 자바스크립트 객체
- numpy
- 자바스크립트 element api
- 보안뉴스 요약
- 자바스크립트 prototype
- 파이썬
- 보안뉴스한줄요약
- php
- 카카오프로젝트
- 자바스크립트 API
- oracle db
- 깃허브
- 다크웹
- javascript
- 자바스크립트 node
- 보안뉴스
- GIT
- 랜섬웨어
- 보안뉴스요약
- oracle
- 오라클
- 자바스크립트
- 카카오프로젝트 100
- 카카오프로젝트100
- python
- 자바스크립트 jQuery
- Oracle SQL
- 자바스크립트 기본 문법
- Today
- Total
FU11M00N
[LeetCode] Remove Duplicates from Sorted Array - Javascript 본문
Remove Duplicates from Sorted Array
[정렬된 배열에서 중복되는 값 제거]
제약 조건
int[] nums = [...]; // Input array
int[] expectedNums = [...]; // The expected answer with correct length
int k = removeDuplicates(nums); // Calls your implementation
assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}
Example
ex1) Input: nums = [1,1,2]
Output: 2, nums = [1,2,_]
ex2) Input: nums = [0,0,1,1,1,2,2,3,3,4]
Output: 5, nums = [0,1,2,3,4,_,_,_,_,_]
초기 문제 접근 방식
nums 배열에 있는 값들을 중복 제거하면 문제가 풀리겠다고 생각했다.자바스크립트의 filter와 indexOf를 사용해 중복제거를 할 수있다.
indexOf(): 배열에서 특정 값이 처음으로 나타나는 index를 리턴
filter(el, index, arr): 특정 조건에 부합하는 배열의 모든 값을 배열 형태로 리턴
el: 요소값
index: arr에서 요소의 index 값
arr: 순회하는 대상
초기 전체코드
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function (nums) {
nums = nums.filter((el, index, arr) => {
return arr.indexOf(el) === index;
});
console.log(nums);
return nums.length;
};
다시 생각 해보며..
분명 case1, 2 모두 Stdout은 올바르게 출력이 되는데 Output은 중복제거된 배열로 출력되지 않았다.
remove the duplicates in-place such that each unique element appears only once.
letcode에서 문제를 처음 풀어봐 익숙지 않았던 문제가 있었는데, 바로 "in-place"다.
nums 배열은 아마 call by ref로 넘어와 주어진 nums 배열에서 처리해야 한다.
생각해 보니 이전 문제들에서도 "in-place"가 있었는데,
별도의 변수를 생성해서 문제를 푼 게 아닌 바로 splice 같은 것을 했기 때문에 풀렸다.
filter는 새 배열로 반환해 주기 때문에 nums 배열이 새로 만들어져 계속 문제 풀이에 실패했던 것 같다.
그렇기에 이번 문제에선 filter 메서드를 사용하지 않고 nums에 일일이 접근해 중복제거를 하여 풀어야겠다고 생각했다.
solve 전체 코드
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function (nums) {
let tmp = nums[0];
for (let i = 1; i <= nums.length; i++) {
if (nums[i] === tmp) {
nums.splice(i, 1);
i--;
}
tmp = nums[i];
}
return nums.length;
};
tmp 변수를 생성해 해당 변수에 첫 번째 값만 초기화해주고, 반복문을 사용해 뒤에 있는 값과 비교해 값이 같은지 비교했다.
그 후 값이 같다면 splice로 해당 배열을 삭제하고 tmp 값을 계속 변경해 주며 비교했다.
nums 배열은 정렬된 상태로 오기 때문에 배열 인덱스의 바로 뒤의 값과 비교해도 문제없다.
다른 sovle 코드
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function (nums) {
var tmp = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[tmp] !== nums[i]) {
tmp++;
nums[tmp] = nums[i];
}
}
return tmp + 1;
};
위의 방식으로 splice를 사용하지 않고 풀이가 가능하다.
tmp 변수를 0으로 초기화하고 반복문에 nums[tmp] 값과 nums[i]를 비교 해
값이 같지 않다면 tmp를 증가시키고 증가 한 값을 nums[i]에 넣는다.
'알고리즘' 카테고리의 다른 글
[LeetCode] Rotate Array - Javascript (0) | 2023.08.24 |
---|---|
[LeetCode] Majority Element - Javascript (0) | 2023.08.24 |
[LeetCode] Remove Duplicates from Sorted Array II - Javascript (0) | 2023.08.24 |
[LeetCode] Remove Element - Javascript (1) | 2023.08.23 |
[LeetCode] Merge Sorted Array - Javascript (0) | 2023.08.23 |