[leetcode / 15] 3Sum
in Problem Solving on leetcode
날짜: 2021년 8월 24일
카테고리: 배열
태그: Medium
, 15
, 파이썬
입출력 예시
예제 입력 | 예제 출력 |
---|---|
nums = [-1,0,1,2,-1,-4] | [[-1,-1,2],[-1,0,1]] |
nums = [] | [] |
nums = [0] | [] |
코드
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
answer = []
nums.sort()
for i in range(len(nums)-2):
if i > 0 and nums[i] == nums[i-1]:
continue
left, right = i + 1, len(nums) - 1
while left < right:
sum = nums[i] + nums[left] + nums[right]
if sum < 0:
left += 1
elif sum > 0:
right -= 1
else:
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
return answer
풀이 과정
nums
를 풀기 쉽게 정렬하고 시작
nums
의 길이 -2 만큼 (세 수의 합이기 때문) 반복
중복된 값이 있을 수 있으므로 조건을 걸고 continue
로 띄어 넘어 줌
left
에는 i
의 다음 인덱스를 저장하고 right
에는 nums
의 마지막 인덱스를 저장
sum
에는 num
에서 i
인덱스의 원소, left
인덱스의 원소, right
인덱스의 원소의 합을 저장
left
가 right
보다 커질 때까지 조건에 따라 반복
sum
이 0보다 작을 경우 :left += 1
(left를 오른쪽으로 이동)sum
이 0보다 클 경우 :right -= 1
(right를 왼쪽으로 이동)sum
이 0일 경우 :answer
에num
에서i
인덱스의 원소,left
인덱스의 원소,right
인덱스의 원소를 원소로 갖는 배열 저장- 왼쪽 인덱스(오른쪽 인덱스)에 중복 된 원소의 존재 유무를 while문으로 확인하고 있다면 왼쪽(오른쪽)으로 시프트
- 다음 연산을 위해
left += 1
(left를 오른쪽으로 이동),right -= 1
(right를 왼쪽으로 이동)
위의 과정을 반복 후 answer
반환
반성
- 문제를 보았을 때 투 포인터로 접근하면 된다는 생각까지는 들었으나 투 포인터를 응용해서 문제를 풀이하는 데 까지는 사고가 되지 않았다. 수학 문제 처럼 한 유형의 문제를 완벽하게 하기 위해서는 많이 풀어보는 수 밖에 없는 것 같다.