[leetcode] Array/String (Medium) - 80. Remove Duplicates from Sorted Array II

brandonยท2025๋…„ 5์›” 20์ผ
0

leetcode-array/strings

๋ชฉ๋ก ๋ณด๊ธฐ
4/20


Intuition ๐Ÿค”

sliding window of size 3๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ–ˆ๋‹ค.
window์— 2๊ฐœ๊นŒ์ง€์˜ ๊ฐ™์€ ์ˆซ์ž๊ฐ€ ๋“ค์–ด์˜ฌ๋• slow pointer๊ณผ fast pointer ๋‘˜ ๋‹ค ์›€์ง์ธ๋‹ค. ํ•˜์ง€๋งŒ 3๊ฐœ์งธ์—์„œ๋Š” fast pointer๋งŒ ์›€์ง์—ฌ non-duplicate number๋ฅผ ์ฐพ๋Š”๋‹ค.

Deep dive ๐Ÿ™

[a, a, b]์˜ sliding window์™€ c๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” fast pointer๋Š” ๊ฐ€๋Šฅํ• ๊นŒ?

๋งŒ์•ฝ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด c๋Š” b๋ฅผ overwriteํ•ด non-duplicate์ธ element๋ฅผ ์—†์• ๋Š” ๊ฒƒ์ด๋‹ค.

3๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.
1. ์ฒ˜์Œ ์‹œ์ž‘ํ• ๋•Œ๋ถ€ํ„ฐ [a, a, b] ์™€ fastPointer = c๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ฒ˜์Œ ์‹œ์ž‘ํ• ๋• fastPointer == slowPointer์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  1. slow pointer๊ณผ fast pointer์ด ๋‘˜ ๋‹ค ์ด๋™ํ•œ ํ›„ ์ด ์ƒํƒœ์— ๋‹ค๋‹ค๋ฆ„.

์ด ๊ฒฝ์šฐ fast pointer๋Š” b์˜ duplicate check๋ฅผ ํ•˜์ง€ ์•Š์€์ฑ„ c๋กœ ์Šคํ‚ตํ•œ ๊ฒƒ์ด ๋œ๋‹ค. b < c ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ์ „ ์ƒํƒœ์˜ window๋Š”
[?, a, a] ์™€ fastPointer = b <= ์—ฌ์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ a < b์ด๊ธฐ ๋•Œ๋ฌธ์— ? ๋Š” ๋ฌด์กฐ๊ฑด <= a < b์ด๋‹ค. ๊ทธ ๋œป์€ window[2]์— b๊ฐ€ overwrite ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๋œป์ด์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด ๊ฒฝ์šฐ๋„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

  1. fast pointer ๋งŒ ์ด๋™ํ•œ ํ›„ ์ด ์ƒํƒœ์— ๋‹ค๋‹ค๋ฆ„.
    ๊ทธ ๋œป์€ ์ „์˜ window ์ƒํƒœ๋„ [a, a, b]๋ผ๋Š” ๋œป์ด๋‹ค. ๊ทธ ๋œป์€ if check์—์„œ window[0]๊ณผ fastPointer์˜ ๊ฐ’์ด ๊ฐ™์•˜๋‹ค๋Š” ๋œป์ธ๋ฐ, sorted array์ด๊ธฐ ๋•Œ๋ฌธ์— a ํ›„ b, ๋‹ค์Œ ๋‹ค์‹œ a๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด ์ƒํƒœ์˜ window์— ๋‹ค๋‹ค๋ฅผ ์ˆ˜ ์—†๋‹ค.

๋‹ต์•ˆ

class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums.length < 3) {
            return nums.length;
        }

        int slowPointer = 2; 

        for (int fastPointer = 2; fastPointer < nums.length; fastPointer++) {
            if (nums[fastPointer] != nums[slowPointer - 2]) {
                nums[slowPointer] = nums[fastPointer]; 
                slowPointer++; 
            }
        }
        
        return slowPointer; 
    }
}
profile
everything happens for a reason

0๊ฐœ์˜ ๋Œ“๊ธ€