알고리즘 문제(SOL)

[백준/2470/파이썬] 두 용액

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

 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net

Problem

  • KOI 부설 과학연구소에서는 많은 종류의 산성 용액과 알칼리성 용액을 보유하고 있다. 각 용액에는 그 용액의 특성을 나타내는 하나의 정수가 주어져있다.  산성 용액의 특성값은 1부터 1,000,000,000까지의 양의 정수로 나타내고, 알칼리성 용액의 특성값은 -1부터 -1,000,000,000까지의 음의 정수로 나타낸다.
  • 같은 양의 두 용액을 혼합한 용액의 특성값은 혼합에 사용된 각 용액의 특성값의 합으로 정의한다. 이 연구소에서는 같은 양의 두 용액을 혼합하여 특성값이 0에 가장 가까운 용액을 만들려고 한다. 

 

조건

  • 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,000,000 이하이다. N개의 용액들의 특성값은 모두 다르고, 산성 용액만으로나 알칼리성 용액만으로 입력이 주어지는 경우도 있을 수 있다.

SOL

용액의 과정에서, 정렬하는 과정만 추가되었다.

파이썬에는 O(NlogN)의 sort함수가 내장되어 있으니까 , 이용하면, 간단하게 풀린다. 

# 두 용액
import sys
input= sys.stdin.readline

N=int(input().rstrip())
arr=list(map(int,input().split()))
arr.sort()

left,right=0,N-1
idxL,idxR=0,0
_sum=0
_min=sys.maxsize

while left<right:
    _sum= arr[left] + arr[right]
    if _min>abs(_sum):
        idxL=left
        idxR=right
        _min=abs(_sum)
    if _sum <0 :
        left+=1
    elif _sum>0:
        right-=1
    # 0인경우
    else:
        break

print(arr[idxL],arr[idxR])