산성 용액의 특성값은 1부터 10억, 알칼리성 용액의 특성값은 -10억부터 -1까지 음의 정수로 나타난다.
같은 양의 두 용액을 혼합한 용액의 특성값은 혼합에 사용된 각 용액의 특성값의 합으로 정의한다.
연구소에서는 같은 양의 두 용액을 혼합해 특성값이 0에 가장 가까운 용액을 만드려 한다.
예시로 [-99, -2, -1, 4, 98]인 경우 -99와 98을 혼합하여 특성값이 0에 가장 가까운 용액을 만들 수 있다.산성용액, 알칼리성 용액이 특성값이 정렬된 순서로 주어질때 이 중 2개의 서로 다른 용액을 혼합해 특성값이 0에 가장 가까운 용액을 만들어내는 두 용액을 찾는 프로그램을 만들기.
import sys
input = sys.stdin.readline
n = int(input())
sol = list(map(int, input().split()))
start, end = 0, len(sol)-1
val = 1e12
left, right = 0, 0
while start < end:
now_val = sol[start] + sol[end]
if abs(now_val) <= val:
val = abs(now_val)
# 정답제출을 위해 변수로 저장.
left = sol[start]
right = sol[end]
if now_val <= 0:
start += 1
else:
end -= 1
print(left, right)
< 해설 >
초기 val을 흔히 쓰는 1e9를 사용했지만 문제에선 최대 범위가 20억에 가깝기에 틀렸다고 나온다.
문제를 꼼꼼히 읽어 범위를 지정해줄 필요를 느낀 문제.
전체적인 로직은 다음과 같다.
- 입력값들을 모두 처리해주고, 결과적으로 2개의 숫자를 더했을때 0과 가까워야 하는 숫자 2개를 출력해야 하기에, 인덱스 겸 이분 탐색을 위해 start, end 와 left, right를 설정한다.
그러고 값들을 비교해주기 위해 val로 1e12 만큼 큰 숫자를 저장해준다.- 이분 탐색을 통해 주어진 배열의 처음, 끝을 더해 now_val로 두고 이 값이 0보다 작으면 start 인덱스를 하나 늘리고 0보다 크면 end 인덱스를 하나 줄여준다.
- 만일 현재 더한 값이 val보다 작거나 같다면 값들을 갱신해주고 결과로 제출할 left, right 변수 값도 변경해준다.