[이분 탐색,투포인터/파이썬] 백준 2467번 용액

송승윤·2024년 7월 31일
0

문제 링크

https://www.acmicpc.net/problem/2467

첫번째 풀이

1번째부터 n-1번째 수들마다 오른쪽에 있는 용액들을 이분탐색해서 합이 0에 가까운 수를 찾고 기존 답과 비교하는 형식으로 풀었다.

import sys
n=int(input())
li=list(map(int,sys.stdin.readline().split(" ")))
a,b=10**9,10**9
for i in range(n-1):
    target=-li[i]
    l=i+1
    r=n-1
    while l<=r:
        mid=(l+r)//2
        if target==li[mid]:
            a,b=li[i],-li[i]
            break
        elif target<li[mid]:
            r=mid-1
        else:
            l=mid+1
    if i<l<n and abs(li[i]+li[l])<abs(a+b):
        a,b=li[i],li[l]
    if i<r<n and abs(li[i]+li[r])<abs(a+b):
        a,b=li[i],li[r]
print(a,b)

두번째 풀이

구글링을 해보니 이분탐색이 아닌 투포인터로도 풀이가 가능했다. 왼쪽 인덱스와 오른쪽 인덱스에 해당하는 두 값의 합을 기존 답과 비교한다. 또한, 두 값의 합에 따라 왼쪽 인덱스를 늘리거나 오른쪽 인덱스를 줄인다.

import sys
n=int(input())
li=list(map(int,sys.stdin.readline().split(" ")))
a,b=10**9,10**9
l,r=0,n-1

while l<r:
    if abs(li[l]+li[r])<abs(a+b):
        a,b=li[l],li[r]
        if a+b==0:
            break
    if li[l]+li[r]<0:
        l+=1
    elif li[l]+li[r]>0:
        r-=1
print(a,b)

0개의 댓글

관련 채용 정보