Coding Test/BaekJoon_Python

백준 2467 <용액> Python

JunOnJuly 2024. 10. 10. 22:02
728x90

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


용액의 입력은 정렬되어 있다는 점을 활용해 투포인터로 풀 수 있습니다.

 

l 값은 증가할수록 합이 증가하고

r 값은 감소할수록 합이 감소합니다.

 

합이 0 보다 크면 합을 줄여야 하므로 r 값을 감소시키고

합이 0 보다 작으면 합을 늘여야 하므로 l 값을 증가시키면 됩니다.


import sys

input = sys.stdin.readline


def solution(fluids):
    ## 투포인터
    l = 0
    r = len(fluids)-1
    # 최소 절댓값
    min_abs_sum_nums = float('inf')
    # 합이 0 이거나 두 포인터가 교차할 때 까지
    while l < r:
        # 합
        sum_nums = fluids[l] + fluids[r]
        # 최소 절댓값 갱신
        if abs(sum_nums) < min_abs_sum_nums:
            min_abs_sum_nums = min(min_abs_sum_nums, abs(sum_nums))
            min_abs_nums = [fluids[l], fluids[r]]
        # 합이 0 보다 크면 r 값 조정
        if sum_nums > 0:
            r -= 1
        # 합이 0 보다 작으면 l 값 조정
        else:
            l += 1

    print(*min_abs_nums)

# 입력
N = int(input().strip())
fluids = list(map(int, input().strip().split()))
solution(fluids)

 

728x90