Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- javascript
- jsp
- data structure
- 클라우드 컴퓨팅
- python
- JDBC
- JPA
- 크루스칼
- BFS
- 공개키 암호화
- 암호학
- 코테
- cloud computing
- 생성자
- Stack
- dfs
- 자바의정석
- generic class
- Algorithm
- spring
- 가상컴퓨팅
- dbms
- MVC
- 알고리즘
- Java
- 코딩테스트
- sql
- DB
- Queue
- 자료구조
Archives
- Today
- Total
PLOD
[Algorithm] 투포인터(Two pointers) 본문
리스트에 순차적으로 접근해야 할 때 두개의 점의 위치를 기혹하면서 처리하는 알고리즘이다. 정렬되어 있는 두 리스트의 합집합에도 사용됨, 병합정렬(merge sort)의 counquer(정복)영역의 기초가 되기도 한다.
예제 문제 - 특정한 합을 가지는 부분 연속 수열 찾기
투포인터 알고리즘의 대표적인 문제입니다.
어떤 숫자들의 리스트가 주어질 때, 해당 리스트의 연속 수열의 합이 특정 값을 가지는 것을 확인하는 문제입니다.
- 시작점과 끝점이 첫번째 원소의 인덱스를 가리키도록 한다.(start, end = 0,0)
- 현재 부분 합이 M과 같다면 카운트한다. (if sum[start:end] == M)
- 현재 부분 합이 M보다 작다면 end를 1 증가시킨다. (end += 1)
- 현재 부분 합이 M보다 크거나 같다면 start를 1 증가시킨다.(start += 1)
- 모든 경우를 확인할 때까지 2-4번 과정을 반복한다.
그림과 함께 설명하기
위와 같은 리스트와 𝑀=5 일 때의 예시를 생각해봅시다.
- [초기 단계] : 시작점과 끝점이 첫번째 원소의 인덱스를 가리키도록 합니다.
- 현재의 부분 합은 1.
- 현재 카운트 : 0
- [Step 1] : 이전 단계에서의 부분합이 1 -> end를 증가시킵니다.
- 현재의 부분 합 : 3
- 현재 카운트 : 0
- [Step 2] : 부분합이 3 -> end를 증가시킵니다.
- 현재의 부분 합 : 6
- 현재 카운트 : 0
- [Step 3] : 부분합 6 -> start를 1 증가시킵니다.
- 현재의 부분 합 : 5
- 현재 카운트 : 1 (부분합이 5이기 때문에)
- 이걸 계속 반복하다가 마지막
- [마지막]
- 현재의 부분합 : 5
시간복잡도
매 루프마다 항상 두 포인터 중 하나는 1씩 증가하고 각 포인터가 n번 누적 증가해야 알고리즘이 끝납니다.
(백준 2003, 2018을 참고하세요~)
https://www.acmicpc.net/problem/2018
https://www.acmicpc.net/problem/2003
'computer science > Algorithm | Datastructure' 카테고리의 다른 글
[Algorithm] Topology sort(위상 정렬) (0) | 2024.08.04 |
---|---|
[Algorithm] Minimum Spanning Tree(최소 신장 트리) (0) | 2024.08.04 |
[Algorithm] Brute-force(완전탐색) , Backtracking(백트래킹) (0) | 2023.07.31 |
[Algorithm] Shortest path(최단 경로) (0) | 2023.07.12 |
[Algorithm] 동적계획법(Dynamic Programming : DP) (0) | 2023.07.06 |
Comments