일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 파이썬
- python
- Oracle SQL
- 자바스크립트 기본 문법
- ES6
- 카카오프로젝트100
- 카카오프로젝트 100
- 보안뉴스 요약
- 보안뉴스요약
- javascript
- GIT
- php
- 자바스크립트
- 자바스크립트 node
- 카카오프로젝트
- 오라클
- 자바스크립트 API
- 깃허브
- 보안뉴스한줄요약
- 자바스크립트 객체
- 보안뉴스 한줄요약
- 자바스크립트 element api
- 자바스크립트 jQuery
- 다크웹
- numpy
- 보안뉴스
- oracle
- 자바스크립트 prototype
- oracle db
- 랜섬웨어
- Today
- Total
FU11M00N
[LeetCode] Remove Duplicates from Sorted Array II - Javascript 본문
Remove Duplicates from Sorted Array II
[정렬된 배열에서 중복되는 값 제거(최대 2개는 중복을 허용)]
제약 조건
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,1,2,2,3]
Output: 5, nums = [1,1,2,2,3,_]
ex2) Input: nums = [0,0,1,1,1,1,2,3,3]
Output: 7, nums = [0,0,1,1,2,3,3,_,_]
문제 접근 방식
중복되는 배열을 제거해야 하지만, 최대 2개의 같은 값을 남겨두고 중복을 제거해야 한다.
또한 "in-place"로 추가 배열은 생성하면 안된다.
먼저 nums[i]와 num[i+1]를 비교해 둘이 같은 값 이고 nums[i+1]와 nums[i+2]를 비교하여
이것마저도 같다면 num[i+2] 인덱스를 삭제해야겠다고 생각했다.
solve 전체 코드
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function (nums) {
for (let i = 0; i < nums.length; i++) {
if (nums[i] === nums[i + 1] && nums[i + 1] === nums[i + 2]) {
nums.splice(i + 2, 1);
i--;
}
}
return nums.length;
};
처음에 생각해낸 방법으로 바로 문제를 풀이 했다.
다른 sovle 코드
var removeDuplicates = function(nums) {
if(nums.length <= 2) {
return nums.length;
}
let k = 2;
for(let i = 2; i < nums.length; i++){
if(nums[i] != nums[k - 2] || nums[i] != nums[k - 1]){
nums[k] = nums[i];
k++;
}
}
return k;
};
이 코드를 아무리 눈으로 읽어봐도 이해가 되지 않아 화이트보드에 그림을 그려서 for 문을 하나하나 실행해 봤다.
그림을 그리면서도 이게 왜 작동될까에 대해 고민을 했고,
내 기준에서 아직 이해하기에 어려운 로직이라고 느꼈다. 다음부터라도 이 문제와 같은 유형 풀었을 때 이렇게 풀 자신이 없다.
다만 문제를 많이 풀다 보면 이런 식으로 풀어야겠다 하며 생각할 날이 올 것 같다.
이 코드에 대해 100% 이해한 것은 아니지만 내가 이해한 대로 적어보겠다.
우선 splice를 사용하지 않고 풀이가 가능하다.
먼저 배열의 길이가 2일 때 예외 처리를 해준다.
nums 배열은 이미 정렬되어 있고 최대 2개의 중복은 허용이기에 어떠한 값이 들어와도 2개일 때는 중복제거를 할 일이 없다.
반복문의 조건문에서 필자가 작성한 코드는 같으면 중복제거를 해야 할 대상으로 봤지만,
이 코드는 같지 않으면 nums 배열에 들어가야 할 대상으로 보는 거다.
이렇게 작성하면 k를 기준으로 if 문 조건에 부합하면 nums 배열에 들어가야 할 대상으로 보는 거다.
'알고리즘' 카테고리의 다른 글
[LeetCode] Rotate Array - Javascript (0) | 2023.08.24 |
---|---|
[LeetCode] Majority Element - Javascript (0) | 2023.08.24 |
[LeetCode] Remove Duplicates from Sorted Array - Javascript (0) | 2023.08.23 |
[LeetCode] Remove Element - Javascript (1) | 2023.08.23 |
[LeetCode] Merge Sorted Array - Javascript (0) | 2023.08.23 |