PS(Problem Solving)/BOJ

[백준/BOJ] 2470번: 두 용액

JunsuKim 2022. 8. 19.
728x90

문제

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

 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net

해설

이분 탐색을 이용하여 해결할 수 있는 문제이다.

용액들의 특성값을 배열 혹은 리스트에 넣고, 이를 정렬시킨다.

이제 두 개의 포인터를 잡는다. 한개는 배열의 시작 위치인 0, 또 하나는 배열의 마지막 위치인 n - 1로 잡는다.

list[start] + list[end]가 0보다 작다면, 두 수의 값이 0에 더 가까워질 수 있도록 start를 증가시켜준다.

0보다 크다면 end를 줄여 0에 가깝게 만들어준다.

이를 통해 0에 가장 가까운 값을 구해주면 된다.

코드

import java.util.*
import kotlin.collections.ArrayList
import kotlin.math.abs

fun main() = with(System.`in`.bufferedReader()) {
    val n = readLine().toInt()
    val list = ArrayList<Int>(n)

    val st  = StringTokenizer(readLine())
    repeat(n) { list.add(st.nextToken().toInt()) }

    list.sort()

    var start = 0
    var end = n-1
    var min = Integer.MAX_VALUE
    var a = 0
    var b = 0
    while(start < end) {
        val sum = list[start] + list[end]
        if(abs(sum) < min) {
            min = abs(sum)
            a = list[start]
            b = list[end]

            if(sum == 0) break
        }

        if(sum < 0) start++
        else end--
    }

    println("$a $b")
}
728x90

'PS(Problem Solving) > BOJ' 카테고리의 다른 글

[백준/BOJ] 1082번: 해킹  (0) 2022.08.21
[백준/BOJ] 1967번: 트리의 지름  (0) 2022.08.20
[백준/BOJ] 3055번: 탈출  (0) 2022.08.18
[백준/BOJ] 12893번: 적의 적  (0) 2022.08.17
[백준/BOJ] 1707번: 이분 그래프  (0) 2022.08.16

댓글