
백준 2467번 - 용액
https://www.acmicpc.net/problem/2467
풀이
문제의 목표는 두 개의 용액을 혼합했을 때, 혼합된 용액의 특성값이 0에 가장 가깝도록 하는 것입니다. 이 문제는 투 포인터 알고리즘을 사용하여 해결할 수 있습니다.
- 용액의 개수(n)와 각 용액의
ph
값을 입력 받습니다. 이 때ph
값은 용액의 특성값을 말합니다. - 두 포인터
left
와right
를 초기화합니다.left
는 처음 위치에,right
는 마지막 위치에 두고 시작합니다. - 현재
left
와right
가 가리키는 용액을 혼합한ph
값을 구하고, 그 값이 최소ph
값인지 확인합니다. 만약 최소라면, 최소ph
값과 이 때의 두 용액의 값(left_ph
,right_ph
)을 저장합니다. - 두 용액을 혼합한
ph
값이 0보다 작으면left
를 1 증가시키고, 0보다 크면right
를 1 감소시킵니다. 이렇게 하면 혼합된 용액의ph
값이 0에 더 가까워지는 것을 찾을 수 있습니다. left
가right
보다 작을 때까지 위 과정을 반복합니다. 만약 혼합된 용액의ph
값이 정확히 0이면, 최적의 해를 찾은 것이므로 반복을 종료합니다.- 최종적으로 선택된 두 용액의
ph
값을 출력합니다.
코드
# 2467번 용액
import sys
n = int(sys.stdin.readline())
ph = list(map(int, sys.stdin.readline().split()))
left = 0
right = n - 1
min_ph = abs(ph[left] + ph[right])
left_ph = ph[left]
right_ph = ph[right]
while left < right:
p = ph[left] + ph[right]
if abs(p) < min_ph:
min_ph = abs(p)
left_ph = ph[left]
right_ph = ph[right]
if p < 0:
left += 1
elif p > 0:
right -= 1
else:
break
print(left_ph, right_ph)