백준(BOJ)

[Python/파이썬] - 백준(BOJ) 2467번 : 용액

phanre 2022. 6. 5. 02:37

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

 

2467번: 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -

www.acmicpc.net

 

투 포인터를 이용하는 문제이다.

첫번째 인덱스와 마지막 인덱스를 가리키는 포인터를 두개 만들고 조건에 따라 포인터를 옮겨주면 된다.

 

오름차순으로 입력이 주어지기 때문에 포인터끼리의 합이 음수이면 왼쪽 포인터를 오른쪽으로 한칸 옮기고,

포인터값이 양수이면 오른쪽 포인터를 왼쪽으로 한칸 옮기면 된다.

그리고 포인터가 가리키는 값끼리의 합의 절대값을 min값과 비교하여 더 작다면 변경해준다.

이를 왼쪽 포인터가 가리키는 인덱스가 오른쪽 포인터를 가리키는 인덱스보다 작다면 계속 반복한다. 

 

합이 0이면 더이상 작아 질 수 없기 때문에 바로 프린트하고 종료하며 while문을 탈출하면 저장해둔 값을 프린트한다.

 

import sys
input = sys.stdin.readline
n = int(input())
arr = list(map(int,input().split()))
l, r = 0, n-1
m = sys.maxsize
while l < r:
    s = arr[l] + arr[r]
    if m > abs(s):
        answer = [arr[l], arr[r]]
        m = abs(s)
    if s < 0:
        l += 1
    elif s > 0:
        r -= 1
    else:
        break
print(*answer,sep=' ')