[JAVA] 투 포인터(Two-Pointers)

2025. 2. 16. 06:54·코테/알고리즘
728x90

투 포인터

배열에서 원래 이중 for문으로 O(N^2)에 처리되는 작업을 2개 포인터의 움직임으로 O(N)에 해결하는 알고리즘

 

리스트에 순차적으로 접근하여 두 개의 위치를 기록하며 처리
부분 연속 수열 문제에 사용
시간 복잡도 O(N)으로 처리 가능 ( 시간 복잡도를 O(n^2) 에서 최대 O(n) 까지 줄일 수 있습니다.)

순서

투 포인터에서, 2. 둘 다 첫 번째 원소에서 시작하는 경우를 사용하였습니다.
start = 0, end = 0 으로 시작합니다. 투 포인터는 start <= end 여야 합니다.

start < n까지 반복합니다.

  1. 구간 합(sum)이 M을 초과하거나, end가 배열의 범위를 넘으면
    sum-arr[start] , start 오른쪽 한칸 이동을 해줍니다.
  2. 구간 합(sum)이 M과 같거나 이하일때, end가 배열의 범위를 넘지 않을 때
    sum+arr[end] , end 오른쪽 한칸 이동 해줍니다.
    만약 구간합(sum)이 M과 같다면 결과(count)를 증가시켜줍니다.

 

다음과 같은 배열에서 합이 M = 5 인 부분 수열 개수 찾기

S, E 포인터 위치를 배열의 처음에 두고 시작한다.

 

E 포인터를 계속 이동하면서 E가 가리키는 값을 더한다.

 

S 부터 E 까지의 합이 5 이상이되면 E는 이동을 멈춘다. 이 때, 합이 5라면 개수를 센다.
S를 한 칸 움직이고 S가 가리키던 값을 뺀다.

 

투 포인터 자바 코드

public class boj_2003_수들의합2 { //투 포인터
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int[] arr = new int[N];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int start = 0, end = 0, count = 0, sum = 0;
        while (start < N) {
            if (end < N && sum < M) sum += arr[end++];
            else sum -= arr[start++];

            if (sum == M)
                count++;
        }
        System.out.println(count);
    }
}

두 포인터 기본 문제

수들의 합 2 - ● 실버 4
백준 1806 부분합 -  ● 골드 4
백준 1644 소수의 연속합 - ● 골드 3

728x90
반응형

'코테 > 알고리즘' 카테고리의 다른 글

[JAVA] 다익스트라(Dijkstra) -최단경로  (0) 2025.02.16
[JAVA] 우선순위큐(PriorityQueue)  (0) 2025.02.16
[JAVA] 이분 탐색(Binary Search)  (1) 2025.02.15
[JAVA] 그리디(Greedy)  (0) 2025.02.15
[JAVA] 다이나믹 프로그래밍(DP)  (0) 2025.02.15
'코테/알고리즘' 카테고리의 다른 글
  • [JAVA] 다익스트라(Dijkstra) -최단경로
  • [JAVA] 우선순위큐(PriorityQueue)
  • [JAVA] 이분 탐색(Binary Search)
  • [JAVA] 그리디(Greedy)
lakedata
lakedata
lakedata 님의 블로그 입니다.
  • lakedata
    lakedata 님의 블로그
    lakedata
  • 전체
    오늘
    어제
    • 분류 전체보기 (188)
      • cs (82)
        • dev (28)
        • sec (29)
        • ops (25)
      • 자격증 (32)
        • 정보처리기사 (20)
        • 정보보안기사 (1)
        • aws dva (6)
        • aws dop (2)
      • IT서적 (27)
        • 클린아키텍처 (10)
        • 객체지향의사실과오해 (7)
        • 오브젝트 (10)
      • 코테 (42)
        • 알고리즘 (20)
        • 백준 (13)
        • 프로그래머스 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    AWS
    docker
    CS
    Java
    Security
    SQL
    Spring
    알고리즘
  • 최근 댓글

  • 최근 글

  • 반응형
    250x250
  • hELLO· Designed By정상우.v4.10.3
lakedata
[JAVA] 투 포인터(Two-Pointers)
상단으로

티스토리툴바