์ซ์ ๋ฐฐ์ด์ด ์ฃผ์ด์ง๊ณ , ์ด ์ค ๊ฐ 3๊ฐ๋ฅผ ๊ณจ๋ผ 0 ์ ๋ง๋ค ์ ์๋ ๋ชจ๋ ๋ฆฌ์คํธ์ ์กฐํฉ์ ๋ฆฌํดํ๋ ๋ฌธ์ ๋ค.
์์ ์์ [-1, 0, 1, 2, -1, -4] ์ด ๊ฐ์์ -1 -> 0, -1 -> 1 ... ์ด๋ฐ ์์ผ๋ก stack ์ ๋ฃ๊ณ ๋นผ๊ณ , backtracking ์ผ๋ก ๊ตฌํํ์๋ค.
ํ์ง๋ง ์๊ฐ ์ด๊ณผ (TLE) ์ ๊ฑธ๋ ค์ ํ๊ธฐ... ์ต๋ํ ์ค์ฌ๋ณผ๋ ค๊ณ ํ๋๋ฐ๋ ์ ์๋์์ใ ใ
์ฌ๊ธฐ์ ๋ ์ด๋ป๊ฒ ์ค์ผ ์ ์์๊น? ์ผ๋จ์, ์๊ณ ๋ฆฌ์ฆ ์์ฒด๊ฐ ํ๋ฆฐ ๊ฒ ๊ฐ์๋ค. ๋ฐํํ...
from copy import deepcopy
from collections import defaultdict
class Solution:
def dfs(self, nums, index, stack, result, cache):
if index > len(nums) or len(stack) > 3:
return
s = sorted(stack)
if len(stack) == 3:
if (s[0], s[1]) in cache:
return
if (s[0], s[2]) in cache:
return
if (s[1], s[2]) in cache:
return
if sum(stack) == 0:
cache[(s[0], s[1])] = True
cache[(s[1], s[2])] = True
cache[(s[0], s[2])] = True
result.append(deepcopy(stack))
return
if len(stack) == 2:
if (s[0], s[1]) in cache:
return
for j in range(index, len(nums)):
stack.append(nums[j])
self.dfs(nums, j + 1, stack, result, cache)
stack.pop()
if len(stack) == 2:
cache[(s[0], s[1])] = True
return
def threeSum(self, nums: List[int]) -> List[List[int]]:
result = []
stack = []
cache = defaultdict(bool)
nums = sorted(nums)
for i in range(len(nums)):
stack.append(nums[i])
self.dfs(nums, i + 1, stack, result, cache)
stack.pop()
return result์๊ฐ ๋ณต์ก๋๋ ์ ์ฒด ๋ฐฐ์ด N ๊ฐ๋ผ๊ณ ๋ดค์ ๋, ์๊ธฐ ์์ ์ ์ ์ธํ N-1 ๊ฐ์์ 2๊ฐ๋ฅผ ๊ณ ๋ฅด๊ธฐ ๋๋ฌธ์
N * ((N-1) * (N-2) / 2) ์ธ ๊ฒ ๊ฐ๋ค. (?) ๊ทธ๋ฌ๋ฉด O(N^3) ์ด ๋ง๋...?
์ ์ฒด ๋ฐฐ์ด์ ์ ๋ ฌํ ํ์, ํ์ฌ ๊ฐ + ์ผ์ชฝ ๊ฐ + ์ค๋ฅธ์ชฝ ๊ฐ ์ ๋น๊ต ํ์ฌ 0 ์ด๋ฉด ๊ทธ ๊ฐ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ถ๊ฐ, 0 ๋ณด๋ค ์์ผ๋ฉด ์ผ์ชฝ์ ํด๋นํ๋ ์ธ๋ฑ์ค ์ฆ๊ฐ,
0 ๋ณด๋ค ํฌ๋ฉด ์ค๋ฅธ์ชฝ์ ํด๋นํ๋ ์ธ๋ฑ์ค ๊ฐ์ ๋ฅผ ์ ์ฒด N ๋ฒ๋งํผ ๋ฐ๋ณตํ๋ค.
์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด์ ์ ๊ตฌํ๋ ์ผ์ชฝ ๊ฐ์ด ์ฐ์ํด์ ๊ฐ์ ์๋ก ๋ฑ์ฅํ๋ ๊ฒฝ์ฐ (์๋ฅผ ๋ค๋ฉด [-3, -1, -1, -1, 0, 4] ์ ๊ฐ์ด ๋ฑ์ฅ) ์ -1 ์ ๋ค์ ๊ณ์ฐํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ผ์ชฝ ๊ฐ์ด ๋ฌ๋ผ์ง ๋ ๊น์ง ์ผ์ชฝ ์ธ๋ฑ์ค๋ฅผ ์ฆ๊ฐ ์ํจ๋ค. ์ค๋ฅธ์ชฝ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ ์ํจ๋ค.
์ด๋ ๊ฒ ์ ์ฒด N ๋ฒ๋งํผ ์ธ๋ฑ์ค๋ฅผ ์ฆ๊ฐ ์ํค๋ฉด์ N-1 ๊ฐ๋ฅผ ๋ฐ๋ณตํ์ฌ left, right ๋ฅผ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ O(N^2) ์ผ๋ก ๊ตฌํํ ์ ์๋ค.
์ฝ๋๋ ์๋์ ๊ฐ๋ค.
from collections import defaultdict
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
result = []
cache = defaultdict(bool)
nums.sort()
for i in range(len(nums) - 1):
left, right = i + 1, len(nums) - 1
while left < right:
res = nums[i] + nums[left] + nums[right]
if res < 0:
left += 1
elif res > 0:
right -= 1
else:
if (nums[i], nums[left], nums[right]) not in cache:
result.append([nums[i], nums[left], nums[right]])
cache[(nums[i], nums[left], nums[right])] = True
while left < right and nums[left] == nums[left + 1]:
left += 1
while left < right and nums[right] == nums[right - 1]:
right -= 1
left += 1
right -= 1
return result