๐Ÿ’ซ ETC/Leetcode

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

ming412 2023. 8. 23. 17:44

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

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

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

 

Remove Duplicates from Sorted Array - LeetCode

Can you solve this real interview question? Remove Duplicates from Sorted Array - Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place [https://en.wikipedia.org/wiki/In-place_algorithm] such that each unique element ap

leetcode.com

์ฃผ์–ด์ง„ ๋ฐฐ์—ด์—์„œ ์ค‘๋ณต๋˜๋Š” ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ผ.
  • ์ž…๋ ฅ
    • nums | int arrray := ์ค‘๋ณต๋œ ์›์†Œ๊ฐ€ ํฌํ•จ๋œ ๋ฐฐ์—ด, | nums | ∈ [1, 3 * 10^4]
  • ์ถœ๋ ฅ
    • k | int := nums ๋ฐฐ์—ด์—์„œ unique ํ•œ ์›์†Œ์˜ ๊ฐœ์ˆ˜
  • ์กฐ๊ฑด
    • | nums[i] | ∈ [-100, 100]
    • nums ๋ฐฐ์—ด์€ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.

 

๐Ÿ”Ž ์–ด๋–ค ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ๋Š”๊ฐ€?

Two Pointer ๋ฐฉ์‹์„ ์ƒ๊ฐํ–ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” visited ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  rp๋กœ nums ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ํ•œ ๋ฒˆ ์ด์ƒ ๋‚˜์˜จ ์›์†Œ๋Š” visited ๋ฐฐ์—ด์— ์ฒดํฌํ•ด๋‘”๋‹ค.

visited ๋ฐฐ์—ด์— ์ฒดํฌ๋˜์ง€ ์•Š์€ ์›์†Œ๋“ค์„ lp์— ์ €์žฅํ•œ๋‹ค.

 

๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง€๋Š” nums ๋ฐฐ์—ด์€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— Two Pointer๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

๐Ÿ™ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ: ์ž…๋ ฅ์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ

nums์˜ ๊ธธ์ด๊ฐ€ ์ตœ๋Œ€ 30,000์ด๋ฏ€๋กœ for๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ํ•˜๋‚˜์”ฉ ํƒ์ƒ‰ํ•ด๋„ ๋œ๋‹ค.

 

๐Ÿ“ ์˜์‚ฌ ์ฝ”๋“œ

visited = -100๋ถ€ํ„ฐ 100๊นŒ์ง€ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฐ์—ด
lp, rp = 0, 0

while (rp๊ฐ€ nums๋ฅผ ๋„˜์ง€ ์•Š๋Š” ๋™์•ˆ) {
	if (visited[nums[rp]]๊ฐ€ ์ฒดํฌ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด) {
    	nums[lp]์— nums[rp]๋ฅผ ๋Œ€์ž…ํ•œ๋‹ค.
        lp++;
    }
    rp++;
}

 

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

class Solution {
    public int removeDuplicates(int[] nums) {
        int[] visited = new int[201];
        int lp = 0;
        int rp = 0;

        while (rp < nums.length) {
            if (nums[rp] >= 0 && visited[nums[rp]] == 0) {
                visited[nums[rp]] = 1;
                nums[lp] = nums[rp];
                lp++;
            } else if (nums[rp] < 0 && visited[-(nums[rp]-100)] == 0) {
                visited[-(nums[rp]-100)] = 1;
                nums[lp] = nums[rp];
                lp++;
            }
            rp++;
        }
        
        return lp;
    }
}

 

๋‚ด ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

๋‹จ์ผ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค. N์€ ์ตœ๋Œ€ 30,000 ์ด๋ฏ€๋กœ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„์ด๋‹ค.

 

โœ๏ธ ์„ฑ๋Šฅ ํšŒ๊ณ 

์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์œผ๋กœ ๋‚˜์˜์ง€ ์•Š์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๋‹ค.

 

๐Ÿ’ก ๋ฌด์—‡์„/์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๋ฌธ์ œ์—์„œ nums๋Š” ์ด๋ฏธ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ–ˆ๋‹ค. ํ•ด๋‹น ์กฐ๊ฑด์„ ๋†“์ณค๋‹คใ…œ

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ’์„ ์ฒดํฌํ•˜๋Š” visited ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ๋ฐ”๋กœ ์ด์ „ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

class Solution {
    public int removeDuplicates(int[] nums) {
        int lp = 1;
        for (int rp = 1; rp < nums.length; rp++) {
            if (nums[rp] != nums[rp-1]) {
                nums[lp] = nums[rp];
                lp++;
            }
        }
        return lp;
    }
}

 

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

๋‹จ์ผ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค. N์€ ์ตœ๋Œ€ 30,000 ์ด๋ฏ€๋กœ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„์ด๋‹ค.

 

๐Ÿ›  ๋‚ด ์ฝ”๋“œ์— ์ ์šฉํ•ด๋ณด๊ธฐ

๋ฌธ์ œ์—์„œ nums๋Š” ์ด๋ฏธ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ–ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ’์„ ์ฒดํฌํ•˜๋Š” visited ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ๋ฐ”๋กœ ์ด์ „ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

class Solution {
    public int removeDuplicates(int[] nums) {
        int lp = 1;
        int rp = 1;

        while (rp < nums.length) {
            if (nums[rp] != nums[lp-1]) {
                nums[lp] = nums[rp];
                lp++;
            }
            rp++;
        }
        
        return lp;
    }
}

 

๋А๋‚€ ์ 

๋”์šฑ ์‰ฝ๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋Š”๋ฐ ์‚ฌ์†Œํ•œ ์กฐ๊ฑด์„ ๋†“์ณ ์‹œ๊ฐ„๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ์ฝ”๋“œ๋„ ๋ณต์žกํ•ด์กŒ๋‹ค.

์•ž์œผ๋กœ๋Š” ์กฐ๊ฑด ํ•˜๋‚˜๋ฅผ ๋†“์ณ ์–ด๋ ต๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ์ผ์ด ์—†๋„๋ก ๋ฌธ์ œ๋ฅผ ๊ผผ๊ผผํžˆ ์ฝ์ž!