백준 | 두 용액

jeonghens·2025년 1월 2일

알고리즘: BOJ

목록 보기
105/125

백준 두 용액


import sys

# 입력
n = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))

# 투 포인터로 접근하기 위해 주어진 특성값들을 오름차순 정렬한다.
arr.sort()

left = 0
right = n - 1

# closest_sum: 혼합 특성값의 최적 값
closest_sum = float('inf')
# answer: closest_sum을 만들 수 있는 두 용액의 특성값
answer = (0, 0)

while left < right:
    current_sum = arr[left] + arr[right]

    # 두 용액의 특성값 합의 절댓값이 closest_sum의 절댓값보다 작다면, closest_sum, answer를 업데이트한다.
    if abs(current_sum) < abs(closest_sum):
        closest_sum = current_sum
        answer = (arr[left], arr[right])

    # current_sum에 따라 포인터를 이동시킨다.
    if current_sum < 0:
        left += 1
    elif current_sum > 0:
        right -= 1
    else:
        break

# 출력
print(*answer)

참고로 위의 문제에서 사용한 투 포인터(Two Pointer) 알고리즘은..
정렬된 배열에서 두 포인터를 사용해 특정 조건(부분 합, 구간의 길이, 쌍의 합 등)을 만족하는 값을 찾는 문제에서 많이 쓰인다.
조건에 따라 포인터를 한 방향(또는 서로 다른 방향)으로 이동시키면 된다.

profile
알고리즘이나 SQL 문제 풀이를 올리고 있습니다. 피드백 환영합니다!

0개의 댓글