티스토리 뷰
반응형
문제
문제 상황
- 세수의 합이 0이 되는 케이스를 찾는다.
해결 전략
- Brute Force로 모든 경우를 순회하며 가능성을 찾으면 되지만 O(N^3)로 일반적 조건에서 속도 이슈가 발생할 수 밖에 없다.
- 투포인터를 활용해 한 요소를 기준으로 두 요소를 더해 그 합이 0보다 크면 줄이고, 0보다 작으면 키우는 방향으로 포인터를 이동시킨다.
- 이를 위해 사전에 정렬되어 있을 필요가 있다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
result = []
nums.sort()
# Brute Force O(N^3) -> 속도 이슈 발생
# for i in range(len(nums)-2):
# for j in range(i+1,len(nums)-1):
# for k in range(j+1, len(nums)):
# if nums[i]+nums[j]+nums[k] == 0 : result.append([nums[i],nums[j],nums[k]])
# Two Pointer
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:
if nums[left] + nums[i] + nums[right] < 0: left += 1
elif nums[left] + nums[i] + nums[right] > 0: right -= 1
else :
result.append([nums[i], nums[left], nums[right]]) # 이것으로 연산을 종료하면 while을 빠져나올 방법이 없어 무한루프
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
|
cs |
해설
- 속도에 큰 차이가 안날 것 같지만 중복을 제거해주는 과정은 중요하다.
- 첫 요소를 이동시키며 그 요소의 오른쪽 두 값을 left, right로 지정해 합을 키우거나 줄이는 방향으로 이동시킨다.
새로 학습한 것 & 실수
- 문제는 테스트케이스의 [0,0,0,0]에서 발생했는 데, 20, 21번째 줄의 중복을 제거하는 부분을 안 넣으면 답이 [0,0,0], [0,0,0]으로 같은 요소가 두번 나오게 된다. 하나의 답을 찾았을 때, 다음 찾는 답이 중복되지 않음을 확인해야 하는데, 답을 넣을 때 in 함수를 써도 되지만 그것보단 위의 방법이 더 빠르다
- 처음에는 18번째 줄에서 else에 답을 넣는 코드만 넣어 무한 루프에 빠졌다. 좀 더 엄밀한 정의가 필요하다.
반응형
'알고리즘 학습 > 파이썬 알고리즘 인터뷰' 카테고리의 다른 글
[LeetCode] 234.Palindrome Linked List(팰린드롬 연결 리스트) (0) | 2021.03.23 |
---|---|
[파이썬 알고리즘 인터뷰] - 7장 p.193 (Leet Code 238번) (0) | 2021.01.05 |
[파이썬 알고리즘 인터뷰] - 7장 (배열) - 빗물트래핑 (0) | 2020.11.22 |
[파이썬 알고리즘 인터뷰] - 7장 (배열) (0) | 2020.11.18 |
[파이썬 알고리즘 인터뷰] - 6장 (문자열 조작) (0) | 2020.11.12 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준 알고리즘#BackTracking
- 배열합치기#분할정복#BOJ#Python
- API#lazy#
- 섬의개수#백준알고리즘#Python
- 순열사이클#BOJ#Python
- django
- 텀 프로젝트#백준알고리즘#Python
- 나무자르기#BOJ#이분탐색#Python
- filter#isalnum#lower
- 리모컨#완전탐색#BOJ#Python
- 랜선자르기#이분탐색#BOJ#Python
- 병든 나이트#BOJ#탐욕법#Python
- 토마토#백준알고리즘#Python
- django#slicing
- 반복수열#백준알고리즘#Python
- 공유기 설치#BOJ#이분탐색#Python
- PassingCars#Codility#Python
- Triangle#Sorting#Codility#Python
- 쿼드트리#BOJ#분할정복#Python
- Brackets#Stacks and Queues#Codility#Python
- N으로 표현#DP#Programmers#Python
- 암호코드#dp#BOJ#Python
- 파이썬알고리즘인터뷰#4장
- 터틀비치#리콘#xbox#controller
- Distinct#Codility#Python
- 날짜 계산#BOJ#완전탐색#Python
- 종이자르기#분할정복#BOJ#Python
- NumberofDiscIntersections#Codility#Sort#Python
- 미로 탐색#백준알고리즘#Python
- Swift#Tuples#Range
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함