logseq 20260122
This commit is contained in:
parent
71cb8fef99
commit
f325ee2e00
@ -5,4 +5,5 @@
|
|||||||
- [[다익스트라 알고리즘 (Dijkstra Algorithm)]]
|
- [[다익스트라 알고리즘 (Dijkstra Algorithm)]]
|
||||||
- [[벨만-포드 알고리즘 (Bellman-Ford Algorithm)]]
|
- [[벨만-포드 알고리즘 (Bellman-Ford Algorithm)]]
|
||||||
- [[분할정복(Divide and Conquer)]]
|
- [[분할정복(Divide and Conquer)]]
|
||||||
- [[진수변환 알고리즘]]
|
- [[진수변환 알고리즘]]
|
||||||
|
- [[투 포인터(Two Pointers)]]
|
||||||
71
pages/투 포인터(Two Pointers).md
Normal file
71
pages/투 포인터(Two Pointers).md
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
deck:: Logseq/coding tip
|
||||||
|
|
||||||
|
- ## **► 개념(Concept)**
|
||||||
|
- 1차원 배열(리스트)에서 {{c1 두 개의 포인터(인덱스)}}를 조작하여 원하는 결과를 찾아내는 기법.
|
||||||
|
id:: 6972072d-bf82-4f1a-a003-ca1527fb112b
|
||||||
|
보통 이중 반복문 로직 {{c1 ($O(N^2)$)}}을 최적화하여 {{c1 ($O(N)$)}}의 시간 복잡도로 결과를 얻어내게 됨.
|
||||||
|
-
|
||||||
|
- ## **► 유형(pattern)**
|
||||||
|
- ### ◼︎ 양 끝에서 좁혀오는 방식(Collision)
|
||||||
|
- #### ◉ 동작 원리
|
||||||
|
- id:: 69720ad1-9712-4934-b0e4-daa540fdd95f
|
||||||
|
1. 길이가 N인 1차원 배열에 대해 두 포인터 left, right가 각각 {{c1 0}}, {{c1 N-1}}에서 시작.
|
||||||
|
2. 조건에 따라 left는 {{c1 오른쪽으로(+1)}}, right는 {{c1 왼쪽으로(-1)}} 이동.
|
||||||
|
3. 두 포인터가 {{c1 교차하거나 만날 때 (left >= right)}} 종료
|
||||||
|
- #### ◉ 주요 용도 #card
|
||||||
|
id:: 69720bbd-d10e-49b7-bcf7-5cc75d2c7428
|
||||||
|
- 정렬된 배열에서 두 수의 합 찾기.
|
||||||
|
- 팰린드롬 검사
|
||||||
|
extra:: 팰린드롬(palindrome)이란, 뒤집어도 원본과 일치하는 배열을 의미
|
||||||
|
- #### ◉ 예제
|
||||||
|
- 정렬된 배열 nums에서 합이 target이 되는 두 수를 찾는 파이썬 함수를 작성하라.
|
||||||
|
id:: 69720c2d-cb74-49c2-9b61-41979aca8468
|
||||||
|
(target을 입력으로 받는 함수이고 nums는 전역변수로 선언되어 있고, 정답 조합은 반드시 존재하고 오직 한개만 존재한다고 가정한다. 출력값은 튜플 형태로 두 수의 인덱스를 반환한다.)
|
||||||
|
#card
|
||||||
|
- ```python
|
||||||
|
def twoSum(target) :
|
||||||
|
left, right = 0, len(nums) - 1
|
||||||
|
|
||||||
|
while left < right :
|
||||||
|
curr_sum = nums[left] + nums[right]
|
||||||
|
if curr_sum == target :
|
||||||
|
return (left, right)
|
||||||
|
elif curr_sum < target :
|
||||||
|
left += 1
|
||||||
|
else :
|
||||||
|
right -= 1
|
||||||
|
```
|
||||||
|
- ### ◼︎ 같은 방향으로 이동하는 방식(Forwarding)
|
||||||
|
- #### ◉ 동작 원리
|
||||||
|
- id:: d44956cd-a48f-43c5-9b1b-e7a7d0b54e9c
|
||||||
|
1. 길이가 N인 1차원 배열에 대해 두 포인터 left, right가 각각 {{c1 0}}, {{c1 0}}에서 시작.
|
||||||
|
2. {{c1 right}}를 오른쪽으로 늘려가며 범위를 확장.
|
||||||
|
3. 특정 조건을 만족하면 {{c1 left}}를 오른쪽으로 이동해서 범위를 축소.
|
||||||
|
4. {{c1 right}}가 끝에 도달하면 종료
|
||||||
|
- 위의 방식의 응용으로 만약 left와 right의 폭이 고정적인 상태로 움직인다면 이를 {{c1 슬라이딩 윈도우(sliding window)}} 기법이라고도 부른다.
|
||||||
|
id:: 6972102a-a070-4903-8a30-1b9c29ed7922
|
||||||
|
- #### ◉ 주요 용도 #card
|
||||||
|
id:: fcd552eb-b6a4-436c-8cb4-93844aa1a1de
|
||||||
|
- 부분 배열의 합
|
||||||
|
- 특정 조건을 만족하는 연속 구간 찾기
|
||||||
|
- #### ◉ 예제
|
||||||
|
- 배열 nums에서 합이 M이 되는 연속 부분 수열의 개수를 찾는 파이썬 코드를 작성하라.
|
||||||
|
id:: 6d5397f3-9cad-4a0f-9d2c-1a093047290c
|
||||||
|
#card
|
||||||
|
- ```python
|
||||||
|
count = 0
|
||||||
|
interval_sum = 0
|
||||||
|
right = 0
|
||||||
|
|
||||||
|
for left in range(len(nums)) :
|
||||||
|
while interval_sum < M and right < len(nums) :
|
||||||
|
interval_sum += nums[right]
|
||||||
|
end += 1
|
||||||
|
|
||||||
|
if interval_sum == M :
|
||||||
|
count += 1
|
||||||
|
|
||||||
|
interval_sum -= nums[left]
|
||||||
|
|
||||||
|
print(count)
|
||||||
|
```
|
||||||
Loading…
x
Reference in New Issue
Block a user