# 서로 다른 용액을 혼합하여 특성값이 0에 가장 가까운 용액을 만들어내는 두 용액 찾기
# x + y가 0에 가장 가까운 수가 되는 두개의 수 찾기. 오름차순 정렬.
# 0에 가장 가까운 수를 만들어내는 방법? => 절대값이 비슷한 음수와 양수를 합치기
# 투포인터 문제. 배열을 정렬한 후 양쪽 끝에서부터 비교
n = int(input())
liquid = list(map(int, input().split())) # 용액들의 리스트
liquid.sort() # 오름차순 정렬
left = 0 # 포인터. 왼쪽 끝에 위치
right = n-1 # 포인터. 오른쪽 끝에 위치.
result = abs(liquid[left] + liquid[right]) # 초기값은 첫값과 마지막 값의 합의 절댓값
final = [liquid[left], liquid[right]] # 결과로 출력할 더해준 숫자들. 초기값은 첫값과 마지막 값
while left < right: # 두 포인터가 서로 만나기 전까지 반복
left_val = liquid[left]
right_val = liquid[right]
sum = left_val + right_val # 포인터들이 가리키는 수들의 합
if abs(sum) < result: # sum의 절대값이 result보다 작다면 = 더 0에 가까움
result = abs(sum) # result 갱신
final = [left_val, right_val] # 결과도 현재 각 포인터가 가리키는 값으로 갱신
if result == 0: # 만약 현재 result가 0이라면 반복 중지 = 가장 0에 가까움!
break
if sum < 0: # 만약 sum이 0보다 작다면
left += 1 # 왼쪽 포인터를 1칸 앞으로. 이전보다 더 큰 음수를 가리킨다. 0에 더 가까운 수를 만들기 위함.
else: # sum이 0보다 크다면
right -= 1 # 오른쪽 포인터를 1칸 앞으로. 이전보다 더 작은 양수를 가리킴.
print(final[0], final[1]) # 결과 출력
https://www.acmicpc.net/problem/2470
'study > Algorithm' 카테고리의 다른 글
[백준] 파이썬 1072 : 게임 (0) | 2024.04.09 |
---|---|
[백준] 파이썬 2110번 : 공유기 설치 (0) | 2024.04.05 |
[백준] 파이썬 3079번: 입국심사 (0) | 2024.04.05 |
[백준] 파이썬 18870 : 좌표 압축 (0) | 2024.04.05 |
[백준] 파이썬 2805 : 나무 자르기 (0) | 2024.04.05 |