
N 만큼의 IntArray 를 생성하고 오름차순 정렬한 뒤, 절대값 sum - 0 이 가장 작은 값이 되는 left, right 를 찾으면 되는 문제이다.
import koltin.math.abs
/*
* 산성 용액 특성값 - 1 ~ 10억
* 알칼리성 용액 특성 값 - -1 ~ -10억
* 혼합 용액의 특성 값 = 산성 특성값 + 알칼리 특성 값.
* 특성값이 0에 가장 가까운 용액을 만들어야함.
*
* 알칼리, 산성 혼합하지 않고 자신 2개로만 혼합하여 만들 수도 있음
*
* 첫째 줄 N = 2 ~ 10만
* 둘째 줄 N개의 정수가 빈칸을 사이에 두고 주어짐
*
* 출력 첫째 줄에 0에 가장 가까운 용액을 만들어내는 두 용액의 특성값 오름차순 출력.
* 0에 가장 가까운 용액을 만들어내는 경우가 두 개 이상일 경우 아무거나 하나
*
* n 은 10만이므로 10^2 만 아니라면 가능
* */
fun `2470 - 두 용액`(){
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val n = br.readLine().toInt()
val token = java.util.StringTokenizer(br.readLine())
val solutionArr = IntArray(n){ token.nextToken().toInt() }
val resultArr = IntArray(2)
var result = Int.MAX_VALUE
var left = 0
var right = n - 1
solutionArr.sort()
while(left < right){
val sum = solutionArr[left] + solutionArr[right]
val absSum = abs(sum)
if(result >= absSum){
resultArr[0] = solutionArr[left]
resultArr[1] = solutionArr[right]
result = absSum
if(sum == 0) break
}
// sum 이 음수라면 더 큰값이 필요하므로 left 를 증가, 양수라면 더 작은값이 필요하므로 right 를 줄인다.
if(sum < 0) left++
else right--
}
bw.write(resultArr.joinToString(" "))
bw.flush()
bw.close()
br.close()
}