설명에 들어가기 앞서 링크된 블로그를 읽어 보시길 추천합니다
말 그대로 두 개의 포인터를 이용하여 진행하는 알고리즘이다. 백문이 불여일견! 예제를 통해 어떤 알고리즘인지 확인해보자.
2018. 수들의 합5 을 통해 설명드리도록 하겠습니다.
투 포인터 유형의 문제 접하면서 주의했던 점은 아래와 같다.
예제 입력 1의 N의 값이 15이다. 1부터 N까지의 자연수를 연속적으로 더하므로 굳이 배열을 생성하지 않고 좌측, 우측 인덱스만을 이용하여 가지수를 구해도 된다.
위 문제의 투 포인터를 움직이는 기준은 아래와 같다.
초기 상황
우측 포인터를 1로 이동
우측 포인터를 2로 이동
우측 포인터를 5로 이동
우측 포인터를 6으로 이동
우측 포인터가 6인 경우, n보다 크게 된다. 여기서부터 우측 포인터는 증가되지 않고 좌측 포인터가 움직이게 된다.
좌측 포인터를 1로 이동
좌측 포인터를 2로 이동
좌측 포인터를 3으로 이동
sum과 n이 동일하므로 좌측 포인터를 고정시킨 채, 우측 포인터를 움직인다.
위의 과정을 좌측, 우측 인덱스가 범위 내에 존재할 때까지 반복하면 된다.
좌측 인덱스를 4로 이동
좌측 인덱스를 5로 이동
우측 인덱스를 8로 이동
좌측 인덱스를 6으로 이동
우측 인덱스를 9로 이동
좌측 인덱스를 7로 이동
좌측 인덱스를 8로 이동
우측 인덱스를 10으로 이동
좌측 인덱스를 9로 이동
우측 인덱스를 11로 이동
좌측 인덱스를 10로 이동
우측 인덱스를 12로 이동
좌측 인덱스를 11로 이동
우측 인덱스를 13으로 이동
좌측 인덱스를 12로 이동
우측 인덱스를 14로 이동
좌측 인덱스를 13으로 이동
우측 인덱스를 15로 이동
좌측 인덱스를 14로 이동
좌측 인덱스를 15로 이동
위의 동작 과정을 글로 표현하면 아래와 같다.
- 우측 인덱스를 움직인다.
- 조건에 충족되면 우측 인덱스를 고정시키고 좌측 인덱스를 움직인다.
- 우측 인덱스가 범위 밖으로 벗어나면 좌측 인덱스를 끝까지 움직인다.