๋ฌธ์ ํด๊ฒฐ ๊ณผ์
โ๏ธ ๋๋ง์ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ์ ๋ฆฌํ๊ธฐ (=์ฒด๊ณํ)
Remove Duplicates from Sorted Array II - LeetCode
Can you solve this real interview question? Remove Duplicates from Sorted Array II - Given an integer array nums sorted in non-decreasing order, remove some duplicates in-place [https://en.wikipedia.org/wiki/In-place_algorithm] such that each unique elemen
leetcode.com
์ค๋ณต์ ์ต๋ ๋ ๊ฐ๊น์ง๋ง ํ์ฉํ๋๋ก ์ฃผ์ด์ง ๋ฐฐ์ด์ ๋ณ๊ฒฝํ๋ผ.
- ์
๋ ฅ
- nums | int arrray := ์ค๋ณต๋ ์์๊ฐ ํฌํจ๋ ๋ฐฐ์ด, | nums | ∈ [1, 3 * 10^4]
- ์ถ๋ ฅ
- k | int := nums ๋ฐฐ์ด์์ ์๋ฏธ์๋ ์์์ ๊ฐ์ (์ฐ๋ ๊ธฐ ์์ ์ ์ธ)
- ์กฐ๊ฑด
- | nums[i] | ∈ [-10000, 10000]
- nums ๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋์ด์๋ค.
๐ ์ด๋ค ์์ผ๋ก ์ ๊ทผํ๋๊ฐ?
Two Pointer ๋ฐฉ์์ ์๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ์์ผ๋ก ์ค๋ณต๋๋ ์์ ๊ฐ์๋ฅผ ์นด์ดํธํ๋ค.
ํฌ๊ฒ ๋ฐ๋ก ์ ์์ ๊ฐ์ ๋์ ๋ฐ๋ก ์ ์์ ๋ค๋ฅผ ๋๋ก ๋๋๋๋ฐ,
๋ฐ๋ก ์ ์์ ๊ฐ๋ค๋ฉด ์นด์ดํธ๋ฅผ ์ฆ๊ฐํ๊ณ ๋ค๋ฅผ ๋๋ ์นด์ดํธ๋ฅผ ์ด๊ธฐํํ๋ค.
๋ฐ๋ก ์ ์์ ๊ฐ์ ๋, ์นด์ดํธ๊ฐ 2์ผ ๋๋ ์ ์ฅํ๊ณ 2๋ณด๋ค ํฌ๋ค๋ฉด ์ ์ฅํ์ง ์๋๋ค.
๐ ์๊ณ ๋ฆฌ์ฆ ์ ํ: ์ ๋ ฅ์ ํฌ๊ธฐ๋ฅผ ๋ฐํ์ผ๋ก
nums์ ๊ธธ์ด๊ฐ ์ต๋ 30,000์ด๋ฏ๋ก for๋ฌธ์ ์ด์ฉํ์ฌ ํ๋์ฉ ํ์ํด๋ ๋๋ค.
๐ ์์ฌ ์ฝ๋
lp = 1;
cnt = 1;
for (rp=1๋ถํฐ; nums ๋ฐฐ์ด ๋๊น์ง; 1์ฉ ์ฆ๊ฐ) {
if (์ด์ ์์ ๊ฐ์ผ๋ฉด) {
cnt ์ฆ๊ฐ
if (cnt๊ฐ 2๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด) {
nums[lp]์ nums[rp] ๋์
lp++
}
} else (์ด์ ์์ ๋ค๋ฅด๋ฉด) {
nums[lp]์ nums[rp] ๋์
lp++
cnt 1๋ก ์ด๊ธฐํ
}
}
๐ฏ ๊ตฌํ ์ฝ๋
class Solution {
public int removeDuplicates(int[] nums) {
int lp = 1;
int cnt = 1;
for (int rp = 1; rp < nums.length; rp++) {
// ์ด์ ์์ ๊ฐ์ผ๋ฉด cnt ์ฆ๊ฐ
if (nums[rp] == nums[lp-1]) {
cnt++;
if (cnt <= 2) {
nums[lp] = nums[rp];
lp++;
}
} else { // ์ด์ ์์ ๋ค๋ฅด๋ฉด cnt ์ด๊ธฐํ
nums[lp] = nums[rp];
lp++;
cnt = 1;
}
}
return lp;
}
}
๋ด ์ฝ๋๋ฅผ ํ๊ตฌํด๋ณด๊ธฐ
โฑ ์ฑ๋ฅ ์ธก์ (์๊ฐ๋ณต์ก๋/๊ณต๊ฐ๋ณต์ก๋)
๋จ์ผ for๋ฌธ์ ์ฌ์ฉํ์์ผ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ O(N)์ด๋ค. N์ ์ต๋ 30,000 ์ด๋ฏ๋ก ๊ฐ๋นํ ์ ์๋ ๋ฒ์์ด๋ค.
โ๏ธ ์ฑ๋ฅ ํ๊ณ
์๊ฐ ๋ณต์ก๋๋ O(N)์ผ๋ก ๋์์ง ์์ง๋ง ๊น๋ํ ์ฝ๋๋ผ๊ณ ์๊ฐ๋์ง๋ ์๋๋ค.
๐ก ๋ฌด์์/์ด๋ป๊ฒ ๊ฐ์ ํ ์ ์์๊น?
ํ์ฌ ์ฝ๋์์๋ nums[lp] = nums[rp]; ์ lp++; ์ด ๋ ๋ฒ ์ฌ์ฉ๋๋ค. ์ฐ์๋๋ ์๋ฅผ ์ธ๋ cnt ๋ณ์๋ฅผ ์ด์ฉํ๋ ๊ฒ ์ธ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๋ฉด ์ค๋ณต ์ฝ๋๋ฅผ ์์จ ์ ์์ง ์์๊น.
๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ํ๊ตฌํด๋ณด๊ธฐ
๐ฏ ๊ตฌํ ์ฝ๋
์ค๋ณต์ ์ต๋ ๋ ๊ฐ๊น์ง ํ์ฉํ๋ค๊ณ ํ์ผ๋ฏ๋ก ๋ฐ๋ก ์ด์ ์(nums[lp-1])๊ฐ ์๋ nums[lp-2]์ ๋น๊ตํ ์ ์๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๋ฉด ํน์ ์์๊ฐ ๋ช ๋ฒ ์ค๋ณต๋๋์ง ์นด์ดํธ ํ ํ์๊ฐ ์๋ค.
class Solution {
public int removeDuplicates(int[] nums) {
if (nums.length <= 2) {
return nums.length;
}
int index = 2;
for (int i = 2; i < nums.length; i++) {
if (nums[i] != nums[index - 2]) {
nums[index] = nums[i];
index++;
}
}
return index;
}
}
โฑ ์ฑ๋ฅ ์ธก์ (์๊ฐ๋ณต์ก๋/๊ณต๊ฐ๋ณต์ก๋)
๋จ์ผ for๋ฌธ์ ์ฌ์ฉํ์์ผ๋ฏ๋ก ๋ง์ฐฌ๊ฐ์ง๋ก ์๊ฐ ๋ณต์ก๋๋ O(N)์ด๋ค.
๐ ๋ด ์ฝ๋์ ์ ์ฉํด๋ณด๊ธฐ
๋ฌธ์ ์์ ์ค๋ณต ํ์ฉ์ด ๋ ๊ฐ๊น์ง ๋๊ธฐ ๋๋ฌธ์ ์ค๋ณต ๊ฐ์ ์๋ฅผ ์ธ๋ cnt ๋ณ์๋ฅผ ๋ง๋ค์์๋๋ฐ,
cnt ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , nums[rp]์ nums[lp-2]๊ฐ ๊ฐ์ง ์๋ค๋ฉด ์ค๋ณต์ด ์ต์ 3๊ฐ ์ด์์ธ ๊ฒ์ผ๋ก ํ๋จํ ์ ์๋ค.
class Solution {
public int removeDuplicates(int[] nums) {
// ์ค๋ณต 2๊ฐ๊น์ง ํ์ฉํ๋ ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 2์ดํ๋ผ๋ฉด ๊ทธ๋๋ก ๋ฆฌํด
if (nums.length <= 2) {
return nums.length;
}
int lp = 2;
for (int rp = 1; rp < nums.length; rp++) {
if (nums[rp] != nums[lp-2]) { // ๊ฐ์ง ์์ ๋๋ง ๋์
ํ๊ณ lp ๊ฐฑ์
nums[lp] = nums[rp];
lp++;
}
// ๊ฐ๋ค๋ฉด lp๋ ๊ฐฑ์ ํ์ง ์๊ณ rp๋ง ๊ฐฑ์ ํ๋ค
}
return lp;
}
}
์ค๋ณต์ด ์๋ ํจ์จ์ ์ธ ์ฝ๋๋ก ๊ฐ์ ํ ์ ์์๋ค.
๋๋ ์
๋ฌธ์ ๋ฅผ ์ฝ์๋ง์ ์๊ฐ๋๋ ๋ฐฉ๋ฒ์ ์นด์ดํธ ๋ณ์๋ฅผ ๋๋ ๊ฒ์ด์๋๋ฐ, ์์ผ๋ก ๋ฌธ์ ๋ฅผ ๋ง์ด ํ์ด ๋น์ทํ ์ ํ์ ์ต์ํด์ง๋ค๋ฉด nums[lp-2]์ ๋น๊ตํ ์๊ฐ์ ํ ์ ์์ง ์์๊น.
'๐ซ ETC > Leetcode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Week 1-1. [Array / String] 189. Rotate Array (0) | 2023.08.24 |
---|---|
Week 1-1. [Array / String] 169. Majority Element (0) | 2023.08.23 |
Week 1-1. [Array / String] 26. Remove Duplicates from Sorted Array (0) | 2023.08.23 |
Week 1-1. [Array / String] 27. Remove Element (0) | 2023.08.23 |
Week 1-1. [Array / String] 88. Merge Sorted Array (0) | 2023.08.23 |