import sys
input = sys.stdin.readline
n = int(input())
solutions = sorted(list(map(int,input().split())))
min_sum = float('inf')
final_answer = []
for i in range(n-2):
solution = solutions[i]
l = i+1
r = n-1
while l < r:
current_sum = solution + solutions[l] + solutions[r]
if abs(current_sum) < min_sum:
min_sum = abs(current_sum)
ans = [solution, solutions[l], solutions[r]]
if current_sum < 0: l += 1
elif current_sum > 0: r -= 1
else: exit(print(*ans))
print(*ans)
가장 간단한 방법은 세 개의 용액을 선택하는 모든 경우의 수를 탐색하는 것이다. 하지만 이 방법은 시간 복잡도가 O(N³)이 되어 N이 5,000일 경우 시간 초과가 발생한다.
따라서 더 효율적인 접근 방식이 필요하다. 이 문제는 정렬과 투 포인터 알고리즘을 결합하여 O(N²) 시간 복잡도로 해결할 수 있다.
left 포인터는 고정된 용액 바로 다음에서 시작한다.right 포인터는 리스트의 가장 끝에서 시작한다.left 포인터 용액, right 포인터 용액)의 특성값 합을 계산한다.left 포인터를 오른쪽으로 한 칸 이동시킨다.right 포인터를 왼쪽으로 한 칸 이동시킨다.이 과정을 모든 용액에 대해 반복하여 0에 가장 가까운 합을 만드는 세 용액을 찾는다.