๋ฌธ์ ์ ๋ชฉ | ์ ๋ต๋ฅ | ๋์ด๋ |
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 ๊ตฌ๋ฌธ์ ์ด์ฉํ๋ฉด ์๊ฐ์ด ๋ ๋จ์ถ๋๋ค.
'์๊ณ ๋ฆฌ์ฆ๐ฅ > ๋ฌธ์ ํ์ด (Python)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LeetCode] 238. product_of_array_except_self (Medium) 2023/5/2 (0) | 2023.05.02 |
---|---|
[LeetCode] 561. array_partition_i (Easy) 2023/5/2 (0) | 2023.05.02 |
[python] 2. ์ฝ๋ฉํ ์คํธ์์ ์ฌ์ฉ๋๋ Python ๊ธฐ๋ณธ (0) | 2023.04.30 |
[LeetCode] 1. two_sum (Easy) 2023/4/29 (0) | 2023.04.29 |
[LeetCode] 5. longest_palindromic_substring (Medium) 2023/4/28 (0) | 2023.04.28 |