[백준] 2470 - 두 용액

오규성·2025년 10월 29일

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()
}
profile
안드로이드 개발자 Gyu 의 개발 블로그 !

0개의 댓글