문제
문제 설명
정수 배열 nums
가 주어질 때, 다음 조건을 만족하는 모든 세 숫자 조합 [nums[i], nums[j], nums[k]]
을 반환하세요
- i != j, i != k, j != k (즉, 세 숫자의 인덱스가 모두 달라야 합니다.)
- nums[i] + nums[j] + nums[k] = 0 (세 숫자의 합이 0이어야 합니다.)
주의: 결과 집합에는 중복된 세 숫자 조합이 포함되지 않아야 합니다.
예제
예제 1:
- 입력:
nums = [-1, 0, 1, 2, -1, -4]
- 출력:
[[-1, -1, 2], [-1, 0, 1]]
- 설명:
- ( 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 )
- 중복되지 않은 조합은
[-1, -1, 2]
와[-1, 0, 1]
입니다. - 출력의 순서는 중요하지 않습니다.
예제 2:
- 입력:
nums = [0, 1, 1]
- 출력:
[]
- 설명: 가능한 모든 세 숫자의 조합이 0이 되지 않습니다.
예제 3:
- 입력:
nums = [0, 0, 0]
- 출력:
[[0, 0, 0]]
- 설명: ( nums[0] + nums[1] + nums[2] = 0 + 0 + 0 = 0 ).
풀이
해당 문제는 투 포인터를 활용하여 문제를 해결할 수 있습니다. 문제 해결 순서는 다음과 같습니다.
1. 배열 정렬
- 배열을 오름차순으로 정렬합니다. 이렇게 하면 중복된 결과를 쉽게 제거하고 투 포인터를 효율적으로 활용 할 수 있습니다.
2. 반복문 + 투 포인터
- 배열을 순회하면서 각 원소를 기준으로 나머지 두 원소를 찾아 세 숫자의 합이 0 이 되는 조합을 찾습니다.
3. 중복 제거
- 정렬 된 상태에서 각 숫자가 반복되지 않도록 이전 숫자와 같으면 배열 순회를 생략합니다.
코드
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
N = len(nums)
nums.sort()
answer = []
for i in range(N-2):
left, right = i+1, N -1
# 중복되는 triplets 제외
if i > 0 and nums[i] == nums[i-1]:
continue
while left < right:
target = nums[i] + nums[left] + nums[right]
if target == 0:
answer.append([nums[i], nums[left], nums[right]])
# 중복제거
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
elif target <0 :
left +=1
else :
right -=1
return answer
'파이썬' 카테고리의 다른 글
리트코드 - Letter Combinations of a Phone Number (1) | 2024.12.15 |
---|---|
리트코드 - Group Anagrams (0) | 2024.12.15 |