1. 문제유형
- Binary Search
- Two Pointer
2. 자료구조
- l (int): 첫 번째 원소 인덱스
- r (int): 마지막 원소 인덱스
- flag (boolean): 탐색 여부를 결정하는 변수
3. 해결과정
- 만약 첫 번째 값과 마지막 값이 모두 양수라면, 가장 작은 두 값을 출력한다.
- 만약 첫 번째 값과 마지막 값이 모두 음수라면, 가장 큰 두 값을 출력한다.
- 만약 첫 번째 값과 마지막 값의 부호가 다르다면, 탐색을 수행한다.
- 탐색과정은 flag and l < r동안 반복한다.
- sum의 절대값이 answer 값보다 작다면 answer에 sum을 저장하고, a,b = l,r를 저장한다.
- sum이 0보다 작다면 용해값을 키우기 위해 왼쪽값을 증가시킨다.
- sum이 0보다 크다면 용해값을 감소시키기 위해 오른쪽값을 감소시킨다.
n = int(input())
liq = list(map(int, input().split()))
liq.sort()
l, r = 0, n-1
flag = False
a, b, answer = 0, 0, 1000000001
if liq[l]<0 and liq[r]<0:
print(liq[-2], liq[-1])
exit()
elif liq[l]>0 and liq[r] >0:
print(liq[0], liq[1])
exit()
else:
flag=True
while flag and l<r:
sum = liq[l]+liq[r]
if abs(sum) < answer:
answer = abs(sum)
a = l
b = r
if sum < 0:
l += 1
else:
r -= 1
print(liq[a], liq[b])