문제 링크 : https://www.acmicpc.net/problem/2470
투 포인터 문제를 풀 때는 for 문으로 start 를, 그 안에 while 문으로 end 를 조작한다고 기억해두고 있었다. 공식은 아니지만 그게 편해서. 근데 이 문제를 풀고나니까 꼭 그렇지만은 않다고 생각이 들었다.
투 포인터 문제는 말그대로 두 개의 포인터를 조작하는 알고리즘을 생각해야 되기 때문에, 무조건 이렇다라고 생각하면 안될 것 같다.
이 문제에서는 용액을 sort 하고, left 와 right 두 개의 포인터를 각각 양쪽 끝에서 시작해서 가운데로 모아지는 로직을 생각해야 된다.
그래서 while left < right 로 투 포인터를 다뤄야된다.
이제 투 포인터 문제를 풀 때, 기본적으로는 for ~ while 문을 사용하지만, 항상 그런건 아니라고 기억해야겠다.
import sys N = int(sys.stdin.readline()) arr = list(map(int, sys.stdin.readline().split())) arr.sort() left = 0 right = N-1 answer = [arr[left], arr[right]] while left < right: result = abs(arr[left] + arr[right]) if left+1 < right and abs(arr[left+1] + arr[right]) < result: left += 1 elif left < right-1 and abs(arr[left] + arr[right-1]) < result: right -= 1 else: if result < abs(sum(answer)): answer = [arr[left], arr[right]] left += 1 right -= 1 print(answer[0], answer[1])