[PS] BOJ 2467 / 용액
문제 링크: https://www.acmicpc.net/problem/2467
Thumbnail: Photo by Nikita Tikhomirov (Unsplash)
투 포인터인데 누적합입니다.
풀이
투 포인터
입력 배열에 두 개의 포인터를 두고, 두 위치의 용액 농도의 합의 절댓값이 작아지는 방향으로 포인터를 옮겨가며 최솟값을 찾는 방식으로 풀었습니다.
입력 배열이 이미 정렬된 상태이므로, 포인터를 이동시키는 조건은 다음과 같습니다.
왼쪽 포인터 l과 오른쪽 포인터 r이 있을 때, 두 용액의 농도 합을 v라 하면v = liquids[l] + liquids[r] 입니다.
v가 양수라면, 절댓값이 작아지기 위해서는 더 작은 수를 더해야 합니다.
오른쪽 포인터r을 1 줄입니다. (음수의 방향으로 이동합니다.)v가 음수라면, 절댓값이 커지기 위해서는 더 큰 수를 더해야 합니다.
왼쪽 포인터l을 1 키웁니다. (양수의 방향으로 이동합니다.)
전체 코드
input = open(0).readline
N = int(input())
liquids = list(map(int, input().split()))
l = 0
r = N - 1
min_value = 1_000_000_000_001
min_pair = [None, None]
while l < r:
v = liquids[l] + liquids[r]
if abs(m) < abs(min_value):
min_value = v
min_pair[0] = liquids[l]
min_pair[1] = liquids[r]
if v > 0:
r -= 1
elif v < 0:
l += 1
else:
break
print(*min_pair)solution.py