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

[leetCode] 13. 3Sum (์•Œ๊ณ ๋ฆฌ์ฆ˜, ์›๋ฆฌ) with Swift

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

leetCode submit ํ†ต๊ณผํ•˜๋ฉด ๋‹ค๋ฅธ ๋ถ„๋“ค์ด ์งœ ๋†“์œผ์‹  ํ™˜์ƒ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ป€ ์ฐธ๊ณ ์™€ ํ†ต๊ณผ์šฉ์œผ๋กœ ๋ด์ฃผ์„ธ์š” ใ… ใ… 

ํšจ์œจ์„ฑ ๊ฐ–๋‹ค๋ฒ„๋ฆฐ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ํ—ˆํ—ฃ

 

๋‹ค๋ฅธ ๊ธ€์—์„œ ์–ผํ• ๋…ธ๊ฐ€๋‹ค ์ฝ”๋“œ๋ผ๊ณ  ์ ํžŒ ๊ฑธ ๋ดค์–ด์š” ใ…Žใ…Ž ์•„๋งˆ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ๋„ ์žˆ๊ฒ ์ง€๋งŒ ์–ด๋–ป๊ฒŒ๋“  ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ์ด ๋ฌธ์ œ์—์„œ time ๋ณต์žก๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค. 

 

๐Ÿ‘‡๊ด‘๊ณ  ๋ถ™์ด๊ณ  ๋ฌธ์ œ๋ž‘ ์˜ˆ์‹œ ์˜ฌ๋ฆฌ๋ฉด ์•ˆ๋œ๋‹ค๊ณ  ๋“ค์–ด์„œ ๋ฌธ์ œ๋Š” ๋งํฌ๋กœ ๋Œ€์‹ ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘‡

https://leetcode.com/problems/3sum/

 

3Sum - 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

์•Œ๊ณ ๋ฆฌ์ฆ˜

์šฐ์„  ์ •๋ ฌ์„ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! ์ •๋ ฌ์„ ํ•ด์ฃผ๋Š” ์ด์œ ๋Š” ๋‘ ๊ฐ€์ง€ ์ •๋„ ์ธ๋ฐ์š”, ์ฒซ ๋ฒˆ์งธ๋กœ๋Š” ์ค‘๋ณต๋˜๋Š” ์ˆซ์ž๋ฅผ ๋ฐ”๋กœ ์˜† ์ธ๋ฑ์Šค์™€ ๋น„๊ตํ•ด์„œ ์•Œ ์ˆ˜ ์žˆ๊ณ , ๋‘๋ฒˆ์งธ๋Š” ์„ธ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋”ํ•œ ๊ฐ’์—์„œ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž…๋‹ˆ๋‹ค.

์„ธ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋”ํ•œ ๊ฐ’์ด ๋งŒ์•ฝ 0๋ณด๋‹ค ํฌ๋‹ค๋ฉด ํ˜„์žฌ ์„ธ๊ฐœ์˜ ์ˆซ์ž ํ•ฉ์—์„œ ์–ด๋–ค ์ˆซ์ž๋ฅผ ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๊ณ , ๋งŒ์•ฝ ์„ธ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋”ํ•œ ๊ฐ’์ด 0๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์„ธ๊ฐœ์˜ ์ˆซ์ž ํ•ฉ์—์„œ ์–ด๋–ค ์ˆซ์ž๋ฅผ ๊ทธ ๋ณด๋‹ค ๋” ํฐ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒ˜ํ•ด ์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

๐Ÿ‘‡์ž์„ธํ•œ ์„ค๋ช…์€ ์•„๋ž˜ ์œ ํŠœ๋ธŒ๋ฅผ ํ†ตํ•ด ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค๐Ÿ‘‡

https://www.youtube.com/watch?v=6qgC-dqKElA

์šฐ์„  ์ฃผ์–ด์ง„ nums ์–ด๋ ˆ์ด๋ฅผ sort ํ•ด์ค๋‹ˆ๋‹ค. ์Šค์œ„ํ”„ํŠธ๋กœ๋Š” 

nums.sort()

ํ•ด์ฃผ์‹œ๋ฉด ๋ฐฐ์—ด์„ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

ํ˜„์žฌ ๊ฐ’ current๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค ์ธ -4๋กœ ์ง€์ •ํ•˜๊ณ  ์ฒซ๋ฒˆ์งธ ์ธ๋ฑ์Šค ๋ฐ”๋กœ ์˜†์— ์ธ๋ฑ์Šค๋ฅผ leftIndex, ๋งจ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋ฅผ rightIndex๋กœ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋•Œ ์„ธ๊ฐœ์˜ ๊ฐ’์„ ๋”ํ•ฉ๋‹ˆ๋‹ค.  total sum = current + left + right ๊ฐ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ๊ฐ’์„ ๋”ํ•ด์ฃผ๊ณ  0๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. 

์œ„ ๊ทธ๋ฆผ์—์„œ ์„ธ๊ฐœ์˜ ์ˆซ์ž ํ•ฉ์€ -3์ด๋ฏ€๋กœ 0๋ณด๋‹ค ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ํฐ ์ˆซ์ž๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ๋นจ๊ฐ„ ์„ ์„ ๋ด์ฃผ์„ธ์š”! ์„ธ๊ฐœ์˜ ์ˆซ์ž ์ค‘ ํ•˜๋‚˜๋ฅผ ํฐ ์ˆซ์ž๋กœ ๋ฐ”๊ฟ” ์ค€๋‹ค๋ฉด 0 ๊ณผ ๊ฐ€๊นŒ์›Œ ์ง€๊ฒŒ ๋˜๋Š” ์›๋ฆฌ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ + ๋ฐฉํ–ฅ์œผ๋กœ left๋ฅผ ์ด๋™ํ•ด ์ฃผ๋ฉด ๊ฐ’์ด ์ ์  ์ปค์ง€๋ฏ€๋กœ ํ˜„์žฌ left์— ์žˆ๋Š” ์ˆซ์ž๋ณด๋‹ค ๋” ํฐ ๊ฐ’์œผ๋กœ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (ํ˜„์žฌ๋Š” -1 ์˜†์— -1์ด์ง€๋งŒ...)

๊ณ„์† ์˜ฎ๊ฒจ ์ฃผ๋‹ค๊ฐ€ ๋งŒ์•ฝ ์„ธ๊ฐœ์˜ ํ•ฉ์ด 0๋ณด๋‹ค ํฌ๊ฒŒ ๋˜๋ฉด right. ์ธ๋ฑ์Šค๋ฅผ - ๋ฐฉํ–ฅ์œผ๋กœ ์˜ฎ๊ฒจ์„œ ์ด ํ•ฉ์˜ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋‹ค๊ฐ€ ์›ํ•˜๋Š” ๋ฐฐ์—ด ์กฐํ•ฉ์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด current ์ธ๋ฑ์Šค๋ฅผ ์˜ฎ๊ฒจ ์ค๋‹ˆ๋‹ค,

left ์ธ๋ฑ์Šค๋Š” ๋ฌด์กฐ๊ฑด current  ์ธ๋ฑ์Šค์˜ +1 ์—์„œ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๊ณ  right๋Š” ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋กœ ์ง€์ •ํ•ด ์ฃผ๋ฉด ๋˜๋Š”๋ฐ 

์ด๋Š” current index์˜ ์™ผ์ชฝ์„ ์‹ ๊ฒฝ ์จ์ฃผ์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ํƒ์ƒ‰์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

 

์ด๋ฅผ ๊ทธ๋Œ€๋กœ ํ•ด์ฃผ๋ฉด ์„ธ์ƒ์— ํ•˜์œ„ 7%๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค!

์•ž์„œ ์ ์—ˆ๋“ฏ์ด ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ค„์—ฌ ์ฃผ์…”์•ผ ํ•ด์š” ใ…Žใ…Žใ…Žใ…Ž

๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ๋ณต์ˆ˜์˜ ๊ฐ’์— ๋Œ€์ฒ˜ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ์—์„œ ์ œ์‹œํ–ˆ๋˜ ๋ณต์ˆ˜ ์กฐํ•ฉ๋„ ์ค„์—ฌ์ค„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด๋ ‡๊ฒŒ ํ•ด์ฃผ์–ด์•ผ ํƒ์ƒ‰ ๋ฒ”์œ„์™€ ์‹œ๊ฐ„๋„ ์ค„์–ด ๋“ญ๋‹ˆ๋‹ค. 

class Solution {
    func threeSum(_ nums: [Int]) -> [[Int]] {
        
        var newNums = nums
        newNums.sort()
        var answer = [[Int]]()
        
        var currentIndex = 0
        var leftIndex = currentIndex + 1
        var lastIndex = newNums.count - 1
        var rightIndex = lastIndex
        
        while currentIndex < newNums.count - 2 {
            if  (currentIndex != 0) && (newNums[currentIndex] == newNums[currentIndex-1]) {
                currentIndex += 1
                leftIndex = currentIndex + 1
                rightIndex = lastIndex
                continue
            }
            while leftIndex != rightIndex {
                
                let currentSum = newNums[currentIndex] + newNums[leftIndex] + newNums[rightIndex]
                
                if currentSum < 0 {
                    leftIndex += 1
                }
                
                if currentSum > 0 {
                    rightIndex -= 1
                }
                
                if currentSum == 0 {
                    let subAnswerArray = [newNums[currentIndex], newNums[leftIndex], newNums[rightIndex]]
                    answer.append(subAnswerArray)
                    leftIndex += 1
                }
            }
            
            currentIndex += 1
            leftIndex = currentIndex + 1
            rightIndex = lastIndex
        }
        return Array(Set(answer))
    }
}

์šฐ์„  ํ†ต๊ณผํ•œ ์ฝ”๋“œ์ธ๋ฐ ์ถ”ํ›„์— ํšจ์œจ์„ฑ ๊ณ ๋ คํ•ด์„œ ๋งˆ์ง€๋ง‰ ๋ณต์ˆ˜ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ๋„ฃ์€ set ๋ถ€๋ถ„์„ ๊ณ ์ณ๋ด์•ผ ๋ ๊ฑฐ ๊ฐ™์•„์š” ใ… ใ… 

 

์ฒซ ๋ฐ˜๋ณต๋ฌธ์˜ ๋ฒ”์œ„๋Š” 

์šฐ์„  ํ˜„์žฌ ์ธ๋ฑ์Šค์—์„œ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋‘๊ฐœ์˜ ์ˆซ์ž๋กœ ์กฐํ•ฉํ•˜๋ฏ€๋กœ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋ฅผ count-1์ด๋ผ ํ•  ๋•Œ ์˜ค๋ฅธ์ชฝ์— ๋‘ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋‚จ๊ฒจ์•ผ ํ•˜๋ฏ€๋กœ count-3 ๊นŒ์ง€๋งŒ ๋ฐ˜๋ณตํ•˜์—ฌ ์กฐํšŒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒ”์œ„๋Š” 0 < index < count-2 ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 

 

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€