์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿฅš/๋ฌธ์ œํ’€์ด (Python)

[LeetCode] 15. 3sum (Medium) 2023/5/1

๐Ÿช„ํ•˜๋ฃจ๐Ÿช„ 2023. 5. 1. 23:30
728x90
๋ฌธ์ œ ์ œ๋ชฉ ์ •๋‹ต๋ฅ  ๋‚œ์ด๋„
15. 3sum 32.6% Medium
 

3Sum - LeetCode

Can you solve this real interview question? 3Sum - 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 du

leetcode.com

 

๋ฌธ์ œ์š”์•ฝ

์ •์ˆ˜ํ˜• ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง€๋ฉด ํ•ฉ์ด 0์ด ๋˜๋Š” 3๊ฐœ์˜ ์ˆซ์ž์Œ์„ ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•˜์—ฌ๋ผ

์กฐ๊ฑด 1) ์›์†Œ๊ฐ€ 3๊ฐœ ์ด์ƒ 1000๊ฐœ ์ดํ•˜์ธ ์ •์ˆ˜ํ˜• ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง€๋ฉฐ ๋ฐฐ์—ด์˜ ํŠน์ • ์š”์†Œ๋Š” 3๊ฐœ์˜ ์ˆซ์ž์Œ์—์„œ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”๋‹ค

์กฐ๊ฑด 2) 3๊ฐœ์˜ ์ˆซ์ž์Œ์˜ ์ˆœ์„œ๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค

 

 

์ƒ๊ฐํ–ˆ๋˜ ํ’€์ด 1. Brute-Froce(๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๋Œ€์ž…) -> for ๋ฌธ์žฅ ์„ธ ๊ฐœ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ•˜๊ธฐ - (์‹œ๊ฐ„๋ณต์žก๋„ $O(n^{3})$)

์ƒ๊ฐํ–ˆ๋˜ ํ’€์ด 2. ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ ๋’ค, ํˆฌํฌ์ธํ„ฐ ์ด์šฉ -> sort(), for ์‚ฌ์šฉํ•ด์„œ ํ’€์ด - (์‹œ๊ฐ„๋ณต์žก๋„ $O(n^{2})$

 

 

ํ’€์ด 2-1 (1459 ms)

ํˆฌํฌ์ธํ„ฐ ์ด์šฉ

 

Step1. ๋ฐฐ์—ด์„ ์ •๋ ฌ -> sort() ํ•จ์ˆ˜

 

 

Step2. ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ, ์„ธ ๋ฒˆ์งธ ์›์†Œ๊ฐ’์˜ ํ•ฉ์„ ๊ธฐ์ค€์œผ๋กœ ํฌ์ธํ„ฐ ์œ„์น˜ ๋ณ€๊ฒฝ -> for, while

์Œ์ˆ˜์ด๋ฉด ์™ผ์ชฝ ํฌ์ธํ„ฐ ์œ„์น˜ ์ฆ๊ฐ€

0์ด๋ฉด ์„ธ ์›์†Œ๋ฅผ ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€

์–‘์ˆ˜์ด๋ฉด ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ ์œ„์น˜ ๊ฐ์†Œ

 

 

Setp3. ์ค‘๋ณต๋œ ์›์†Œ ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ๊ฑฐ -> set ํ•จ์ˆ˜ ์ด์šฉ

 

๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ์— ์ค‘๋ณต์ œ๊ฑฐ ํ•˜๋Š” ๋ฒ•_์ผ์ฐจ์› ๋ฐฐ์—ด์ผ ๋•Œ (๋‹จ์ˆœ ํ˜•๋ณ€ํ™˜) list(set(list_value))
๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ์— ์ค‘๋ณต์ œ๊ฑฐ ํ•˜๋Š” ๋ฒ•_์ด์ฐจ์› ์ด์ƒ์˜ ๋ฐฐ์—ด์ผ ๋•Œ
(ํŠœํ”Œ ์ด์šฉ)
set(list(map(tuple, (list_value))))

 

 

๊ตฌํ˜„ 1 (4038ms)

๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•œ ๋’ค, set์˜ ํŠน์„ฑ(๋™์ผํ•œ ์›์†Œ๋Š” ํ•˜๋‚˜๋กœ ์ทจ๊ธ‰)์„ ์ด์šฉํ•ด์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐ

์ตœ์ ํ™” Point

  • 3๊ฐœ์˜ ์ˆœ์„œ์Œ ์ด๋ฏ€๋กœ ์ฒซ๋ฒˆ์งธ ์›์†Œ์˜ ์ธ๋ฑ์Šค๋Š” 0~len(nums)-3 ๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค.
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        result=[]
        for idx in range(0, len(nums)-2):
            first=nums[idx]
            left=idx+1
            right=len(nums)-1
            while(left<right):
                second=nums[left]
                third=nums[right]
                now_sum=first+second+third
                if now_sum<0:
                    left+=1
                elif now_sum>0:
                    right-=1
                else:
                    result.append([first, second, third])
                    left+=1
                    right-=1
        return set(list(map(tuple,(result))))

 

 

ํ’€์ด 2-2 (1459 ms)

ํˆฌํฌ์ธํ„ฐ ์ด์šฉ

 

Step1. ๋ฐฐ์—ด์„ ์ •๋ ฌ -> sort() ํ•จ์ˆ˜

 

 

Step2. ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ, ์„ธ ๋ฒˆ์งธ ์›์†Œ๊ฐ’์˜ ํ•ฉ์„ ๊ธฐ์ค€์œผ๋กœ ํฌ์ธํ„ฐ ์œ„์น˜ ๋ณ€๊ฒฝ -> for, while

์Œ์ˆ˜์ด๋ฉด ์™ผ์ชฝ ํฌ์ธํ„ฐ ์œ„์น˜ ์ฆ๊ฐ€

0์ด๋ฉด ์„ธ ์›์†Œ๋ฅผ ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€

์–‘์ˆ˜์ด๋ฉด ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ ์œ„์น˜ ๊ฐ์†Œ

 

 

Setp3. ์ค‘๋ณต๋œ ์›์†Œ ํŠน๋ณ„์ฒ˜๋ฆฌ

์ฒซ ๋ฒˆ์งธ ์›์†Œ : ์ค‘๋ณต๋œ ์›์†Œ n๊ฐœ์ด๋ฉด 2๊ฐœ ๋‚จ๊ธฐ๋Š” ์œ„์น˜์— ์„ ์ • (์ค‘๋ณต๋œ ์›์†Œ ํ•˜๋‚˜ ์ „์—์„œ ์‹œ์ž‘)

๋‘ ๋ฒˆ์งธ, ์„ธ ๋ฒˆ์งธ ์›์†Œ : ์ค‘๋ณต๋œ ์›์†Œ๊ฐ€ ๋‚˜์˜ค๋ฉด, ์™ผ์ชฝ ํฌ์ธํ„ฐ๋Š” ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋Š” ๊ฐ์†Œ

(์ค‘๋ณต๋œ ์›์†Œ 3๊ฐœ์ธ ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•œ ๋‹จ ํ•˜๋‚˜์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜์ธ (0, 0, 0)์€ idx ๋ฐ˜๋ณต๋ฌธ์˜ ์กฐ๊ฑด์ธ len(num)-2์— ์˜ํ•ด ์ œ์™ธ๋˜์ง€ ์•Š๋Š”๋‹ค)

 

 

๊ตฌํ˜„ 2 (1459ms)

๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•œ ๋’ค, set์˜ ํŠน์„ฑ(๋™์ผํ•œ ์›์†Œ๋Š” ํ•˜๋‚˜๋กœ ์ทจ๊ธ‰)์„ ์ด์šฉํ•ด์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐ

์ตœ์ ํ™” Point

  • 3๊ฐœ์˜ ์ˆœ์„œ์Œ ์ด๋ฏ€๋กœ ์ฒซ๋ฒˆ์งธ ์›์†Œ์˜ ์ธ๋ฑ์Šค๋Š” 0~len(nums)-3 ๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ค‘๋ณต๋˜๋Š” ์›์†Œ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด continue ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค
    • ๋‹จ, ์ฒซ๋ฒˆ์งธ ์›์†Œ๋Š” ์ค‘๋ณต๋œ ์›์†Œ ํ•˜๋‚˜ ์ „์—์„œ ์‹œ์ž‘ํ•˜๊ฒŒ ํ•œ๋‹ค ( -1, -1, 2) ์ด๋Ÿฐ ํ˜•์‹์ผ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        result=[]
        for idx in range(0, len(nums)-2):
            if idx>0 and nums[idx-1]==nums[idx]:
                continue
            first=nums[idx]
            left=idx+1
            right=len(nums)-1
            while(left<right):
                second=nums[left]
                third=nums[right]
                now_sum=first+second+third
                if now_sum<0:
                    left+=1
                elif now_sum>0:
                    right-=1
                else:
                    result.append([first, second, third])
                    while left<right and second==nums[left+1]:
                        left+=1
                    while left<right and third==nums[right-1]:
                        right-=1
                    left+=1
                    right-=1
        return result

 

๋ฐ˜๋ณต๋ฌธ ์•ˆ์— ๋˜ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์กฐ๊ฑด ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ๋ณด๋‹ค๋Š”, if-continue ๊ตฌ๋ฌธ์„ ์ด์šฉํ•˜๋ฉด ์‹œ๊ฐ„์ด ๋” ๋‹จ์ถ•๋œ๋‹ค.

728x90