https://www.acmicpc.net/problem/2470
if (sum < 0) {
left++
} else if (sum > 0) {
right--
} else {
baseLeft = arr[left]
baseRight = arr[right]
break
}
sum
을 최대한 작은 값으로 만들기 위한 구현이다.
sum
이 0보다 작으면, left
를 증가시켜 가장 작은 값을 증가시킨다.
반대로 sum
이 0보다 크면, right
를 증가시켜 가장 큰 값을 감소시킨다.
sum
이 0이 되는 경우에는 곧바로 중단한다.
import java.io.*
import java.util.StringTokenizer
// input
private var br = System.`in`.bufferedReader()
// variables
private var N = 0
private lateinit var arr: IntArray
fun main() {
val bw = System.out.bufferedWriter()
input()
bw.write(solve())
bw.close()
} // End of main()
private fun solve(): String {
val sb = StringBuilder()
arr.sort()
var left = 0
var right = N - 1
var minDiff = Int.MAX_VALUE
var baseLeft = 0
var baseRight = 0
while (left < right) {
val sum = arr[left] + arr[right]
val diff = Math.abs(sum)
if (diff < minDiff) {
minDiff = diff
baseLeft = arr[left]
baseRight = arr[right]
}
if (sum < 0) {
left++
} else if (sum > 0) {
right--
} else {
baseLeft = arr[left]
baseRight = arr[right]
break
}
}
sb.append(baseLeft).append(' ').append(baseRight)
return sb.toString()
} // End of solve()
private fun input() {
N = br.readLine().toInt()
var st = StringTokenizer(br.readLine())
arr = IntArray(N) {
st.nextToken().toInt()
}
} // End of input()