
난이도 : 골드 5
유형 : 투포인터
https://www.acmicpc.net/problem/2470
숫자의 개수 N을 입력받고
N개만큼의 숫자 배열을 입력받는다 이 숫자 배열에서 0에 가장 가까운 숫자는 무엇인지 찾아내 오름차순으로 출력해주면 된다.
(만약 복수정답이라면 아무거나 하나 출력한다.)
완전 탐색을 할 경우 O(N^2)으로 N의 범위가 최대 100,000이기에 시간이 너무 오래걸린다.
정렬 + 투포인터 기법을 이용하여 풀면 시간복잡도를 줄이며 0 의 가까운 값을 찾을 수 있다.
import sys
input = sys.stdin.readline
INF = float('inf')
N = int(input())
# 리스트 입력받고 정렬까지
nums = sorted(list(map(int,input().split())))
left = 0 # 첫 숫자
right = N - 1 # 마지막 숫자
abs_sum = INF
answer = (nums[left], nums[right])
while left < right:
total = nums[left] + nums[right]
if abs(total) < abs_sum:
abs_sum = abs(total)
answer = (nums[left],nums[right])
if abs_sum == 0:
break;
if total < 0:
left += 1
else:
right -= 1
print(answer[0], answer[1])