백준 2470번 두 용액 Kotlin

: ) YOUNG·2025년 2월 26일
1

알고리즘

목록 보기
458/465
post-thumbnail

백준 2470번 두 용액 Kotlin

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()

0개의 댓글