문제
https://www.acmicpc.net/problem/2470
풀이
두 용액을 섞어서 특성값이 0에 가장 가까운 용액을 만들어내는 문제이다.
우선 입력받은 용액의 특성값들을 오름차순으로 정렬한 후, 투 포인터를 사용해 풀이했다.
- 산성 용액 또는 알칼리성 용액만으로 이루어진 입력이 들어오는 경우
- 절댓값이 가장 작은 값 2개를 더할때 특성값이 0에 가장 가까운 용액이 만들어진다.
- 산성, 알칼리성 용액이 모두 포함된 입력이 들어오는 경우
- 양쪽 끝의 용액들을 더하는 것으로 시작해서, 인덱스를 하나씩 옮겨가며 특성값의 합을 계속 비교한다.
- 특성값의 합이 0보다 작다면, 더 큰 수를 더해야 한다는 뜻이므로 왼쪽 인덱스를 하나 증가시킨다.
- 특성값의 합이 0보다 크다면, 더 작은 수를 더해야 한다는 뜻이므로 오른쪽 인덱스를 하나 감소시킨다.
N = int(input())
Ns = list(map(int, input().split()))
Ns.sort() # 오름차순 정렬
# 모든 용액의 특성값이 음수이거나, 양수인 경우 -> 절댓값이 가장 작은 값 2개를 더해야 함
if Ns[-1] < 0 : # 특성값이 모두 음수 (모두 알칼리성 용액)
print(Ns[-2], Ns[-1])
elif Ns[0] > 0 : # 특성값이 모두 양수 (모두 산성 용액)
print(Ns[0], Ns[1])
# 특성값에 음수와 양수가 섞여있는 경우
else :
sum = 1e9
left, right = 0, N-1
while (left < right) :
temp = Ns[left] + Ns[right]
if abs(sum) > abs(temp) : # 현재 두 용액의 합이 기존의 합보다 0에 더 가까운 경우 -> 정답 후보 갱신
sum = temp
answer = [Ns[left], Ns[right]]
if temp < 0 : # 합이 0보다 작다 -> 합이 더 커져야 한다 -> 더 큰 수를 더해야 한다 -> 왼쪽 인덱스 증가
left += 1
elif temp > 0 : # 합이 0보다 크다 -> 합이 더 작아져야 한다 -> 더 작은 수를 더해야 한다 -> 오른쪽 인덱스 감소
right -= 1
else : # temp == 0 : 합이 0이므로 더 볼 필요 없음
break
print(*answer)
728x90