투 포인터 예제 - 2

문제 분석

  • 번호의 합, 즉 크기를 비교하므로 값을 정렬하면 문제를 좀 더 쉽게 해결할 수 있다.

  • N의 최대 범위가 15,000이므로 O(nlogn) 시간 복잡도를 갖는 정렬 알고리즘을 사용해도 문제가 없다.

  • 입력한 N개의 재룟값을 정렬한 다음, 양쪽 끝의 위치를 투 포인터로 지정해 문제를 해결할 수 있다.

손으로 풀어보기

  1. 재료 데이터를 배열 A에 저장한 후 오름차순 정렬한다.

  2. 투 포인터 i, j를 양쪽 끝에 위치시킨 후 문제의 조건에 적합한 투 포인터 이동 원칙을 활용하여 탐색을 수행한다.

    • A[i] + A[j] > M; j--; : 번호의 합이 M보다 크면 큰 번호 index를 내린다.

    • A[i] + A[j] < M; i++; : 번호의 합이 M보다 작으면 작은 번호 index를 올린다.

    • A[i] + A[j] == M; i++; j--; : 양쪽 포인터를 모두 이동시키고 count를 증가시킨다.

    • 정렬을 했기 때문에 이 조건대로 움직일 수 있다.

  3. 2단계를 ij가 만날 때까지 반복한다.

img_2.png

슈도코드

코드 구현 - 파이썬

코드 구현 - 자바

Last updated