아이디어는 통했다. 그러나 구현단이 아직 많이 미숙하다.. 많이 하면서 친숙해져야 한다.
문제
배열을 입력받아 합으로 0을 만들 수 있는 3개의 엘리먼트를 출력하라
입력
nums = [-1, 0, 1, 2, -1, -4]
출력
[ [-1, 0, 1], [-1, 2, -1] ]
풀이
- 브루트포스 풀이 O(n^3)
- 이 경우 시간 에러날 듯
- for문 한 개와 투포인터 O(n^2)
- 정렬 O(nlogn)
- for문으로 하나를 잡고, 투포인터를 돌면서 좌측의 엘리먼트의 역값을 타겟으로 삼음
- 중복되는 요소가 없어야 함으로 for문 돌 때 조건 추가
nums.sort() results = [] 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[left]+nums[right]+nums[i] if sum < 0: left += 1 continue elif sum > 0: right -= 1 continue else: output.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 results
새로운 개념
- left, right = i+1, len(nums)-1
- 한번에 할당하기
- 투 포인트 기법
- 지속적으로 등장하는데, 대개 정렬되어 있을 때 유용하다.
- 왼쪽 포인터와 오른쪽 포인터 두 지점을 기준으로 하는 문제 풀이 전략이다.