๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/Leetcode

๋งค์ผ LeetCode ํ’€๊ธฐ | 3Sums

 

Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.
Notice that the solution set must not contain duplicate triplets.
 
Example 1:
Input: nums = [-1,0,1,2,-1,-4] Output: [[-1,-1,2],[-1,0,1]] Explanation: nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0. nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0. nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0. The distinct triplets are [-1,0,1] and [-1,-1,2]. Notice that the order of the output and the order of the triplets does not matter.
Example 2:
Input: nums = [0,1,1] Output: [] Explanation: The only possible triplet does not sum up to 0.
Example 3:
Input: nums = [0,0,0] Output: [[0,0,0]] Explanation: The only possible triplet sums up to 0.
 
Constraints:
3 <= nums.length <= 3000-105 <= nums[i] <= 105

 

๋‹จ์ˆœ๋ฌด์‹ํ•˜๊ฒŒ ๋ฐ˜๋ณต๋ฌธ 3๊ฐœ๋กœ ํ’€๊ธด ํ’€์—ˆ์ง€๋งŒ, ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋–ด๋‹ค. ๋ฐ˜๋ณต๋ฌธ๋ง๊ณ ๋Š” ์ƒ๊ฐ๋‚˜๋Š” ์ ‘๊ทผ๋ฒ•์ด ์—†์—ˆ๋‹ค. 

class Solution {
    func threeSum(_ nums: [Int]) -> [[Int]] {
        var answer: [[Int]] = []
        for i in 0..<nums.count - 2 {
            for k in 1..<nums.count - 1 {
                for t in 2..<nums.count {
                    if i != k && i != t && k != t {
                        if nums[i] + nums[k] + nums[t] == 0 {
                            let array = [nums[i], nums[k], nums[t]].sorted()
                            if !answer.contains(array) {
                                answer.append(array)
                            }
                    }
                    }
                 }
            }
        }
        return answer
    }
}

 

๋ฐฐ์šด ์ฝ”๋“œ 

class Solution {
    func threeSum(_ nums: [Int]) -> [[Int]] {
        var answer: [[Int]] = []
        let array = nums.sorted() 

        for i in 0..<array.count - 2 {
            if i > 0 && array[i] == array[i-1] {
                continue
            }

            var left = i + 1
            var right = array.count - 1

            while left < right {
                let sum = array[i] + array[left] + array[right]

                if sum == 0 {
                    answer.append([array[i], array[left], array[right]])

                    while left < right && array[left] == array[left + 1] {
                        left += 1
                    }

                    while left < right && array[right] == array[right - 1] {
                        right -= 1 
                    }

                    left += 1 
                    right -= 1

                } else if sum < 0 {
                    left += 1
                } else {
                    right -= 1
                }
            }
        }
        
        return answer
    }
}

 

์ ‘๊ทผ ๋ฐฉ์‹ 
1. array๋ฅผ sortํ•œ๋‹ค. 
2. array๋ฅผ ๋ฐ˜๋ณต๋ฌธ ๋Œ๋ฆฐ๋‹ค. 
4. ์ง€๊ธˆ ์ธ๋ฑ์Šค ๊ฐ’์˜ ๋‹ค์Œ ์ธ๋ฑ์Šค ์›์†Œ์™€ ๊ฐ€์žฅ ๋ฐฐ์—ด์˜ ๊ฐ€์žฅ ๋๋‹จ์— left, right๋ฅผ ๋‘”๋‹ค. 
3. ์ง€๊ธˆ ์ธ๋ฑ์Šค์˜ ์›์†Œ๊ฐ€, ๋ฐ”๋กœ ์ด์ „ ์›์†Œ์™€ ๊ฐ™์œผ๋ฉด ๊ฑด๋„ˆ๋›ด๋‹ค. 
4-1. sum ์ด 0์ด๋ผ๋ฉด, ๋ฐฐ์—ด์— appendํ•œ๋‹ค 
        array[left] == array[left+1] ์ผ ๋•Œ๊นŒ์ง€ left๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค. 
        array[right] == array[right-1] ์ผ๋•Œ๊นŒ์ง€ right๋ฅผ ์™ผ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค. 
        ์ค‘๋ณต ์ง€์ ์„ ์ฐพ์•˜์œผ๋‹ˆ, ๊ทธ ์ง€์ ์—์„œ left์™€ right๋ฅผ ํ•œ ์นธ์”ฉ ์ด๋™์‹œ์ผœ ์ƒˆ๋กœ์šด ์กฐํ•ฉ์„ ์ฐพ๋Š”๋‹ค. 
4-2. sum์ด 0๋ณด๋‹ค ์ž‘์œผ๋ฉด, left๋ฅผ ํ•œ ์นธ ์˜ฎ๊ฒจ์„œ ์ข€ ๋” sum์„ ํฌ๊ฒŒ ๋งŒ๋“ ๋‹ค. 
4-3. sum์ด 0๋ณด๋‹ค ํฌ๋ฉด, right๋ฅผ ํ•œ ์นธ ์˜ฎ๊ฒจ์„œ ์ข€ ๋” sum์„ ์ ๊ฒŒ ๋งŒ๋“ ๋‹ค. 

 


ํˆฌํฌ์ธํ„ฐ ์ ‘๊ทผ๋ฐฉ์‹ 

 

  • ์ •์˜:
    • ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์ด๋‚˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค.
    • ์ฃผ๋กœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ ์Œ์„ ์ฐพ๋Š” ๋ฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.
  • ์ž‘๋™ ๋ฐฉ์‹:
    • ๋ณดํ†ต ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๋Š” ๋ฐฐ์—ด์˜ ์‹œ์ž‘, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • ๋‘ ํฌ์ธํ„ฐ๋ฅผ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์›€์ง์ด๋ฉด์„œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ์‚ฌ๋ก€:
    • ๋‘ ์ˆ˜์˜ ํ•ฉ ๋ฌธ์ œ (์˜ˆ: ์ฃผ์–ด์ง„ ํ•ฉ์„ ๋งŒ๋“œ๋Š” ๋‘ ์ˆ˜ ์ฐพ๊ธฐ)
    • ์„ธ ์ˆ˜์˜ ํ•ฉ ๋ฌธ์ œ (3Sum)
    • ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ ๋ฌธ์ œ
    • ํŒฐ๋ฆฐ๋“œ๋กฌ ํ™•์ธ
  • ์žฅ์ :
    • ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ฐœ์„ : ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ O(n^2)์—์„œ O(n)์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ณต๊ฐ„ ํšจ์œจ์„ฑ: ์ถ”๊ฐ€ ๊ณต๊ฐ„์„ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (in-place ์•Œ๊ณ ๋ฆฌ์ฆ˜).
  • ํ•ต์‹ฌ ์•„์ด๋””์–ด:
    • ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋ถˆํ•„์š”ํ•œ ์กฐํ•ฉ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ ๋‹จ๊ณ„์—์„œ ๊ฒ€์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ขํ˜€๋‚˜๊ฐ‘๋‹ˆ๋‹ค.