투 포인터 알고리즘

: 정렬된 1차원 배열 내에서 시작과 끝을 가리키는 2개의 포인터를 설정한 후 이를 조작해가며 원하는 것을 얻는 알고리즘이다.

 

사용

- 배열 또는 리스트에서 특정 조건을 만족하는 부분 배열 또는 부분 리스트 찾기

- 배열에서 합이 특정 값이 되는 두 요소 찾기

- 정렬된 배열에서 특정 합이 되는 요소 쌍 찾기

 

시간 복잡도

: O(n)

- 각 포인터가 n번 누적 증가해야 알고리즘이 끝나기 때문에 O(n) 시간복잡도가 발생한다.

 

필요성

: 완전 탐색의 경우 O(n²) 시간복잡도가 발생하지만 투 포인터 알고리즘을 사용하면 O(n)의 시간복잡도가 발생한다.

 

공식

ex) 입력된 자연수 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 출력

- 모든 경우를 확인할 때까지 반복

     - 합 < 특정 값: end 포인터 이동하고 해당 값을 합에 더함

     - 합 > 특정 값: 합에서 start 포인터가 가리키는 인덱스의 값을 뺀 후 start 포인터 이동

     - 합 == 특정 값: count 변수를 1 증가시키고 합에서 start 포인터가 가리키는 인덱스의 값을 뺀 후 start 포인터 이동

- count 출력

import java.io.*;
import java.util.StringTokenizer;

public class Main{
	public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer input = new StringTokenizer(br.readLine());
        long n = Long.parseLong(input.nextToken());
        long start = 1;
        long end = 2;
    	long sum = start + end;
    	long count = 1;
    	
    	sum = start;
    	while(start < n && end <= n) {
    		if(sum < n)
    			sum += end++;
    		else if(sum > n){
    			sum -= start;
    			start++;
    		}
    		else {
    			count++;
    			sum -= start;
    			start++;
    		}
    	}
    	System.out.println(count);
    }
}

 

그림 설명

'CS > DataStructure&Algorithm' 카테고리의 다른 글

슬라이딩 윈도우 알고리즘  (1) 2025.05.05
구간 합 알고리즘  (0) 2025.05.01
선형구조 - 큐  (1) 2025.04.30
선형구조 - 스택  (0) 2025.04.30
검색 알고리즘  (0) 2025.04.29

+ Recent posts