투 포인터 예제 - 3
문제 분석
N의 최댓값이 2,000이라 해도, 좋은 수 하나를 찾는 알고리즘의 시간 복잡도는N^2보다 작아야 한다.만약 좋은 수 하나를 찾는 데
N^2인 알고리즘을 사용하면 최종 시간 복잡도는N^3이 되어 제한 시간(2초)안에 문제를 풀 수 없다.
따라서 좋은 수 하나를 찾는 알고리즘의 시간 복잡도는 최소
O(nlogn)이어야 한다.정렬(
nlogn)과 투 포인터(n) 알고리즘을 사용하면 된다.
단, 정렬된 데이터에서 자기 자신을 좋은 수 만들기에 포함하면 안 된다.
손으로 풀어보기
수를 입력받아 리스트에 저장한 후 정렬한다.(
nlogn, 딱 한번)투 포인터
i,j를 배열 양쪽 끝에 위치시키고 조건에 적합한 투 포인터 이동 원칙을 활용해 탐색을 수행한다.판별의 대상이 되는 수를
K라고 가정A[i] + A[j] > K: j--;A[i] + A[j] < K: i++;A[i] + A[j] == K: count++;프로세스 종료정렬을 했기 때문에 이 원칙을 따를 수 있다.
2단계를 리스트의 모든 수에 대하여 반복한다. 즉
K가N이 될 때까지 반복하여 좋은 수가 몇 개인지 센다.

슈도코드
코드 구현 - 파이썬
코드 구현 - 자바
Last updated