BOJ 2467 용액

LONGNEW·2021년 2월 3일
0

BOJ

목록 보기
139/333

https://www.acmicpc.net/problem/2467
시간 2초, 메모리 128MB
input :

  • N (2 <= n <= 100,000)
  • 용액의 특성값(-1,000,000,000 <= 용액 <= 1,000,000,000) <- 오름차순으로 입력.

output :

  • 0에 가장 가까운 용액을 만들어내는 두 용액의 특성값을 출력

조건 :

  • 경우가 두 개 이상일 경우에는 그 중 아무것이나 하나를 출력

입력이 오름차순으로 들어오거나, 두 부분으로 나눌 수 있는 경우엔 투 포인터 부터 생각해보자.

시작점과, 끝점 부터 시작해서 두개를 더한 값에 따라 움직이게 된다.
더한 값의 절대값이 이전보다 작으면 정답을 업데이트 해주는 방식.

더한 값이 양수일 때는 값을 줄여야 하니 값이 큰쪽(오른쪽)의 포인터를 -1 한다.
음수일 때는 값을 늘려야 하니 작은쪽(왼쪽)의 포인터를 +1한다.

import sys

n = int(sys.stdin.readline())
data = list(map(int, sys.stdin.readline().split()))

start = 0
end = len(data) - 1

ret = [0, 0]
val, flag = 9999999999999, 1

while start < end:
    mix = data[start] + data[end]
    if abs(mix) < val:
        ret = [data[start], data[end]]
        val = abs(mix)
    if mix > 0:
        end -= 1
    elif mix < 0:
        start += 1
    else:
        print(data[start], data[end])
        flag = 0
        break
if flag:
    print(ret[0], ret[1])

그리고 값의 범위가 10억이기때문에 최대로 나올수 있는 차이는 20억이라는 것을 알고 있자.

0개의 댓글