two_pointer(a, target): # 패턴 A: 합 = target 페어 카운트 sort(a) l = 0, r = N - 1 cnt = 0 while l < r: s = a[l] + a[r] if s == target: cnt++ l++, r-- elif s < target: l++ else: r-- return cnt
구현
// 정렬된 배열에서 두 수의 합 = target 인 페어 개수 (O(N))#include <bits/stdc++.h>using namespace std;int main() { int n; long long t; cin >> n >> t; vector<long long> a(n); for (auto& v : a) cin >> v; sort(a.begin(), a.end()); int l = 0, r = n - 1, cnt = 0; while (l < r) { long long s = a[l] + a[r]; if (s == t) { cnt++; l++; r--; } else if (s < t) l++; else r--; } cout << cnt << "\n";}
# 정렬된 배열에서 두 수의 합 = target 페어 개수import sysinput = sys.stdin.readlinen, t = map(int, input().split())a = sorted(map(int, input().split()))l, r = 0, n - 1cnt = 0while l < r: s = a[l] + a[r] if s == t: cnt += 1 l += 1; r -= 1 elif s < t: l += 1 else: r -= 1print(cnt)
// 정렬된 배열에서 두 수의 합 = target 페어 개수import java.util.*;import java.io.*;public class Main { 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()); long t = Long.parseLong(st.nextToken()); long[] a = new long[n]; st = new StringTokenizer(br.readLine()); for (int i = 0; i < n; i++) a[i] = Long.parseLong(st.nextToken()); Arrays.sort(a); int l = 0, r = n - 1, cnt = 0; while (l < r) { long s = a[l] + a[r]; if (s == t) { cnt++; l++; r--; } else if (s < t) l++; else r--; } System.out.println(cnt); }}
stdin
6 101 2 3 7 8 9
결과
3
stdin
5 61 2 3 3 5
결과
2
(예제 1: 1+9, 2+8, 3+7 의 3 페어. 예제 2: 1+5, 3+3 의 2 페어)
복잡도
패턴
시간
양 끝에서 좁히기
O(N) (정렬 O(N log N) 별도)
같은 방향 슬라이딩
O(N) amortized
두 정렬된 배열 머지
O(
공간
O(1) (포인터만)
변형 / 활용
부분 합 = K 개수: 누적합 + 두 포인터 (음수 없는 경우만)
부분 곱 ≤ K: 곱셈 인수가 양수일 때
Three sum / k sum: 한 인덱스 고정 + two pointer (한 차원 줄임)
단조 큐 / 단조 스택: 슬라이딩 윈도우의 max/min 유지
머지 정렬의 merge 단계: 자연스러운 두 포인터
함정
1. 정렬 / 단조 조건
값에 단조성 이 있어야 두 포인터가 가능. 임의 순서 입력은 정렬 후 사용.
2. 같은 페어 중복 카운트
(l, r) 과 (r, l) 을 둘 다 세지 않도록 l < r 유지.
3. 같은 값 중복 처리
정렬 후 같은 값이 여러 개면 페어 카운트가 더 복잡 (조합 수). 그룹 별 카운트 후 곱셈.
4. 음수 합 / 0
음수가 섞이면 부분 배열 합 의 단조성이 깨져 슬라이딩 윈도우 사용 불가. 대신 누적합 + 해시.
💬 댓글