๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“š Coding Test

[LeetCode] 217. Contains Duplicate with Swift ๋ฐฐ์—ด์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ์ˆ˜ ์ฐพ๊ธฐ

by ํ‹ด๋”” 2020. 9. 17.
728x90
๋ฐ˜์‘ํ˜•

 

 

Contains Duplicate - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

217๋ฒˆ ๋ฌธ์ œ๋Š”

nums๋Š” intํ˜• ์ˆซ์ž์˜ ๋ฐฐ์—ด์ด๊ณ  ์ด ๋ฐฐ์—ด์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ๊ฐ’์ด ์žˆ์„ ๋•Œ true๋ฅผ ๋ฐ˜ํ™˜

๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์–ธ๋œป ๋ณด๊ธฐ์— ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹œ๊ฐ„ ํšจ์œจ์„ฑ ์ธก๋ฉด์—์„œ ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ๋ฐ›์„ ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.

์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์—ด์—์„œ ์ค‘๋ณต๋œ ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ•จ์ˆ˜๋ฅผ ์จ์•ผ ํ• ์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

1. ์ˆœ์ˆ˜ํ•œ ์„ ํ˜• ํƒ์ƒ‰

๋ง ๊ทธ๋Œ€๋กœ ๋ฐฐ์—ด์„ ์„ ํ˜• ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์›์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋น„๊ตํ•˜๋ฉฐ ๊ฐ™์€ ์ˆ˜๋ฅผ ์ฐพ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์›์†Œ ํƒ์ƒ‰์„ ๋๋‚ธ ๋’ค ๊ฐ™์€ ์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด์ค‘ for๋ฌธ์ด ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— O(n^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๐Ÿ˜…

class Solution {
    func containsDuplicate(_ nums: [Int]) -> Bool {
        
        for i in 0..<nums.length {
            for j in 0..<i {
                if (nums[j] == nums[i]) {
                    return true
                }
            }
        }
        
        return false
    }
}

์ˆœ์ˆ˜ํ•œ ์„ ํ˜• ํƒ์ƒ‰์€ ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜๋ก ์ ์ ๋” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํšจ์œจ์ ์ธ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

2. ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฐฐ์—ด์˜ sort()๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ณต๋˜๋Š” ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด ์ž์‹ ์˜ ์•ž์ด๋‚˜ ๋’ค์— ์žˆ๋Š” ๋ฐฐ์—ด๊ณผ ๋น„๊ต ํ•˜์—ฌ ์ค‘๋ณตํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ฃผ์˜ํ•  ์ ์€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค ๋ฒ”์œ„๊ฐ€ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. heapsort๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(1), sort()๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ ๋ณต์žก๋„๋Š” O(n log n) ์ž…๋‹ˆ๋‹ค. 

class Solution {
    func containsDuplicate(_ nums: [Int]) -> Bool {
        var arr = nums
        arr.sort()
        
        if arr.count <= 1 {
            return false
        }
        
        for i in 0..<(arr.count-1) {
            if (arr[i] == arr[i+1]) {
                return true
            }
        }
        
        return false
    }
}

์ฐธ๊ณ ๋กœ ๋ฐฐ์—ด์˜ min()๊ณผ max()๋Š” O(n)์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

 

3. Set

set์€ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜๋˜๋ฐ ์ดํ•˜ ์…‹์ด๋ผ ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํƒ์ƒ‰๊ณผ ์‚ฝ์ž… ์ •๋ ฌ์—์„œ ํ•ด์‹œ ํ…Œ์ด๋ธ”๊ณผ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฐฐ์—ด์—์„œ ์ค‘๋ณต๋œ ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด Hashtable์„ ์ด์šฉํ•˜๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค์œ„ํ”„ํŠธ์—์„œ Set๊ณผ Dictionary๋Š” Hashable์„ ์ƒ์† ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Set๊ณผ Dictionary๋Š” ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ  ์ฐพ๋Š” ์†๋„ ๋˜ํ•œ ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ์ˆœ์„œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ฐจ๋Œ€๋กœ ์ฝ์–ด์™€์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

class Solution {
    func containsDuplicate(_ nums: [Int]) -> Bool {
        if (nums.count <= 1) {
			return false
		}
        var numSet = Set(nums)
        
        for i in nums {
            if numSet.contains(i) {
                return true
            } else {
                numSet.insert(i)
            }
        }
        
        return false
    }
}

contains()๋Š” ์ธ์ž๋กœ ๋ฐ›์€ ๊ฐ’์ด ํ•ด๋‹น ์…‹์— ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. O(n)์ด๋ฉฐ ์ด๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” count๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. count๋Š” O(1) ์ž…๋‹ˆ๋‹ค.

class Solution {
    func containsDuplicate(_ nums: [Int]) -> Bool {
        if nums.count == 1 { 
        	return false 
        }

		if nums.count != Set(nums).count {
			return true
		}
		return false
	}
}

Set์œผ๋กœ ๋ฐฐ์—ด์„ ๋ฐ›์œผ๋ฉด ์ค‘๋ณต๋œ ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต๋œ ๊ฐ’์ด ์žˆ๋Š” ๋ฐฐ์—ด๊ณผ ๊ฐฏ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

๋งˆ์ง€๋ง‰์œผ๋กœ. HashTable

ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ value์™€ key๋ฅผ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ฒด ์ž…๋‹ˆ๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ ์—ฐ์‚ฐ์€ ๋ณดํ†ต O(1)์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Š” ์ƒ์ˆ˜ ์—ฐ์‚ฐ๊ณผ ๊ฐ™์€ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์—ฐํ•˜๊ฒŒ ์ฆ๊ฐ€ํ•˜๊ณ  ์ค„์–ด๋“ ๋‹ค๊ณ  ํ•ด๋„ ๋ณดํ†ต์ ์œผ๋กœ ๊ฐ™์€ ์‹œ๊ฐ„์˜ ์—ฐ์‚ฐ ์†๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

์ด๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ํ•ด์‹œ ์ถฉ๋Œ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฐ’์ด input๋˜์—ˆ์ง€๋งŒ ๊ฐ™์€ hash ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ™์€ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ™๋‹ค๋Š” ๋œป์€ ์•„๋‹™๋‹ˆ๋‹ค! ํ•ด์‹œ ์ถฉ๋Œ์€  ํ•˜๋‚˜์˜ key๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๊ณ ์œ ์˜ ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์—์„œ ์ด์ ์ด ์ค„์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ํ•ด์‹œ์ถฉ๋Œ์ด ๋นˆ๋ฒˆํ•  ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด Swift์—์„œ๋Š” hasher๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ‘‰ํ‹€๋ฆฌ๊ฑฐ๋‚˜ ์ž˜ ๋ชป๋œ ๋‚ด์šฉ ์ง€์  ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค~ ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ ค์š”!

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€