[백준/파이썬] 2467번: 용액

수박강아지·2025년 6월 14일

BAEKJOON

목록 보기
93/174

문제

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

풀이

  • 두 용액을 혼합하여 특성값이 0에 가까운 용액을 만드려고 한다.
  • 특성값이 0에 가장 가까운 용액의 값 출력

배열에서 2가지 값을 합하여 결과의 절댓값이 0에 가장 가까운 값을 찾는 문제
투 포인터 알고리즘을 활용하여 문제를 해결할 수 있습니다.

if __name__ == "__main__":
    n = int(input())
    arr = sorted(map(int,input().split()))

투 포인터 알고리즘을 사용하기 위해선 배열을 정렬해줄 필요가 있습니다.
그래서 전 입력을 받을 때 sorted()로 입력을 받아 바로 정렬을 해주었습니다.

이제 탐색을 진행할 함수를 선언하겠습니다.

def func():
    left, right = 0, n-1
    res = abs(arr[left] + arr[right])
    l, r = left, right

왼쪽, 오른쪽 인덱스를 배열의 끝값으로 설정
값을 비교하기 위해 결괏값, 왼쪽 인덱스, 오른쪽 인덱스를 설정

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

왼쪽 인덱스가 오른쪽 인덱스보다 크면 종료
현재 인덱스에서 값 비교 시작

        if cur < 0:
            left += 1
        else:
            right -= 1

만약 0보다 작으면 왼쪽 인덱스 + 1
0보다 크거나 같으면 오른쪽 인덱스 - 1

        if abs(cur) < res:
            res = abs(cur)
            l, r = left, right
            
            if res == 0:
                break

현재 값이 이전 결괏값보다 작다면 값 업데이트
0이라면 종료 후 리턴

코드

import sys
input = sys.stdin.readline

def func():
    left, right = 0, n-1
    res = abs(arr[left] + arr[right])
    l, r = left, right
    
    while left < right:
        cur = arr[left] + arr[right]
        
        if abs(cur) < res:
            res = abs(cur)
            l, r = left, right
            
            if res == 0:
                break
            
        if cur < 0:
            left += 1
        else:
            right -= 1
    
    return arr[l], arr[r]

if __name__ == "__main__":
    n = int(input())
    arr = sorted(map(int,input().split()))
    print(*func())

0개의 댓글