728x90
문제
https://www.acmicpc.net/problem/2467
해설
두 용액을 합쳐 0에 가장 가깝게 만들어야 한다.
모든 용액을 입력받은 후, 투 포인터 알고리즘을 통해 문제를 해결하면 된다.
다음과 같이 양 끝점을 변수로 하나씩 잡아 더해준다.
여기서는 -99 + 98이므로 -1이 된다.
값이 -이므로 왼쪽 포인터를 한 칸 옮겨 -2 + 98을 해본다.
이 값이 기존의 합보다 0에 가깝다면 과정을 계속 반복해주면 된다.
코드
import java.util.*
import kotlin.math.abs
private lateinit var liquid: IntArray
fun main() = with(System.`in`.bufferedReader()) {
val n = readLine().toInt()
liquid = IntArray(n)
val st = StringTokenizer(readLine())
repeat(n) { i ->
liquid[i] = st.nextToken().toInt()
}
liquid.sort()
binarySearch()
}
private fun binarySearch() {
var left = 0
var right = liquid.size - 1
val ans = IntArray(2)
var standard = Integer.MAX_VALUE
while(left < right) {
val liquidSum = liquid[left] + liquid[right]
if(abs(liquidSum) < standard) {
standard = abs(liquidSum)
ans[0] = liquid[left]
ans[1] = liquid[right]
}
if(liquidSum < 0) left++
else right--
}
println("${ans[0]} ${ans[1]}")
}
728x90
'PS(Problem Solving) > BOJ' 카테고리의 다른 글
[백준/BOJ] 9252번: LCS 2 (0) | 2022.09.12 |
---|---|
[백준/BOJ] 2623번: 음악프로그램 (0) | 2022.09.10 |
[백준/BOJ] 13904번: 과제 (0) | 2022.09.09 |
[백준/BOJ] 5972번: 택배 배송 (0) | 2022.09.07 |
[백준/BOJ] 13424번: 비밀 모임 (0) | 2022.09.07 |
댓글