PS(Problem Solving)/BOJ

[백준/BOJ] 2467번: 용액

JunsuKim 2022. 9. 9.
728x90

문제

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

 

2467번: 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -

www.acmicpc.net

해설

두 용액을 합쳐 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

댓글