알고리즘

백준 - 2470 두 용액 [이분탐색, 두 포인터]

ghtis1798 2021. 8. 11. 06:30

2470 두 용액

image

1. 문제유형

  • Binary Search
  • Two Pointer

2. 자료구조

  • l (int): 첫 번째 원소 인덱스
  • r (int): 마지막 원소 인덱스
  • flag (boolean): 탐색 여부를 결정하는 변수

3. 해결과정

  • 시작하기 전, 정렬을 수행한다.
  1. 만약 첫 번째 값과 마지막 값이 모두 양수라면, 가장 작은 두 값을 출력한다.
  2. 만약 첫 번째 값과 마지막 값이 모두 음수라면, 가장 큰 두 값을 출력한다.
  3. 만약 첫 번째 값과 마지막 값의 부호가 다르다면, 탐색을 수행한다.
  4. 탐색과정은 flag and l < r동안 반복한다.
  5. sum의 절대값이 answer 값보다 작다면 answer에 sum을 저장하고, a,b = l,r를 저장한다.
  6. sum이 0보다 작다면 용해값을 키우기 위해 왼쪽값을 증가시킨다.
  7. sum이 0보다 크다면 용해값을 감소시키기 위해 오른쪽값을 감소시킨다.
n = int(input())
liq = list(map(int, input().split()))
liq.sort()
l, r = 0, n-1
flag = False
a, b, answer = 0, 0, 1000000001

if liq[l]<0 and liq[r]<0:
    print(liq[-2], liq[-1])
    exit()
elif liq[l]>0 and liq[r] >0:
    print(liq[0], liq[1])
    exit()
else:
    flag=True

while flag and l<r:    
    sum = liq[l]+liq[r]
    if abs(sum) < answer:
        answer = abs(sum)
        a = l
        b = r
    if sum < 0:
        l += 1
    else:
        r -= 1

print(liq[a], liq[b])