๐Ÿ’ซ ETC/Leetcode

Week 1-1. [Array / String] 80. Remove Duplicates from Sorted Array II

ming412 2023. 8. 23. 21:25

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

โœ๏ธ ๋‚˜๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ ์ •๋ฆฌํ•˜๊ธฐ (=์ฒด๊ณ„ํ™”)

https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/?envType=study-plan-v2&envId=top-interview-150 

 

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]์™€ ๋น„๊ตํ•  ์ƒ๊ฐ์„ ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ.