https://www.acmicpc.net/problem/2467
배열에서 2가지 값을 합하여 결과의 절댓값이 0에 가장 가까운 값을 찾는 문제
투 포인터 알고리즘을 활용하여 문제를 해결할 수 있습니다.
if __name__ == "__main__":
n = int(input())
arr = sorted(map(int,input().split()))
투 포인터 알고리즘을 사용하기 위해선 배열을 정렬해줄 필요가 있습니다.
그래서 전 입력을 받을 때 sorted()로 입력을 받아 바로 정렬을 해주었습니다.
이제 탐색을 진행할 함수를 선언하겠습니다.
def func():
left, right = 0, n-1
res = abs(arr[left] + arr[right])
l, r = left, right
왼쪽, 오른쪽 인덱스를 배열의 끝값으로 설정
값을 비교하기 위해 결괏값, 왼쪽 인덱스, 오른쪽 인덱스를 설정
while left < right:
cur = arr[left] + arr[right]
왼쪽 인덱스가 오른쪽 인덱스보다 크면 종료
현재 인덱스에서 값 비교 시작
if cur < 0:
left += 1
else:
right -= 1
만약 0보다 작으면 왼쪽 인덱스 + 1
0보다 크거나 같으면 오른쪽 인덱스 - 1
if abs(cur) < res:
res = abs(cur)
l, r = left, right
if res == 0:
break
현재 값이 이전 결괏값보다 작다면 값 업데이트
0이라면 종료 후 리턴
import sys
input = sys.stdin.readline
def func():
left, right = 0, n-1
res = abs(arr[left] + arr[right])
l, r = left, right
while left < right:
cur = arr[left] + arr[right]
if abs(cur) < res:
res = abs(cur)
l, r = left, right
if res == 0:
break
if cur < 0:
left += 1
else:
right -= 1
return arr[l], arr[r]
if __name__ == "__main__":
n = int(input())
arr = sorted(map(int,input().split()))
print(*func())