백준 [2467] kotlin

[문제]

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

 

2467번: 용액

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

www.acmicpc.net

[풀이]

투 포인터를 통해 풀었다.

입력되는 용액의 순서가 오름차순으로 정렬이 되어져 있는 상태이다.

그렇기 때문에 

왼쪽에서 오른쪽 방향, 오른쪽에서 왼쪽으로 값을 찾아나가며, 0에 가까운 용액을 찾는다.

왼쪽을 가리키는 포인터 left, 오른쪽을 가리키는 포인터를 right라고 가정했을 경우에

용액 배열의 left위치와 right위치를 더한 값이 0보다 작다면, left를 1만큼 증가시키고

만약 크다면, right를 1만큼 감소시킨다.

[코드]

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import kotlin.math.abs

lateinit var br : BufferedReader
lateinit var bw : BufferedWriter
fun main()
{

    br = BufferedReader(InputStreamReader(System.`in`))
    bw = BufferedWriter(OutputStreamWriter(System.`out`))

    var arr = arrayListOf<Long>()
    var N = br.readLine().toInt()
    for(value in br.readLine().split(" ").map{it.toLong()})
    {
        arr.add(value)
    }
    var left = 0
    var right = N-1
    var ansL = arr[left]
    var ansR = arr[right]

    while (left < right)
    {
        val tmp = arr[left] + arr[right]
        if(abs(tmp) < abs(ansL + ansR)){
            ansL = arr[left]
            ansR = arr[right]
        }
        if(tmp < 0) left++
        else right--
    }
    bw.write(ansL.toString() + " " + ansR.toString())
    bw.flush()
    bw.close()
}

'백준 > 투 포인터' 카테고리의 다른 글

백준 [1644] - kotlin  (0) 2023.06.27
백준 [3646] kotlin  (0) 2023.01.30
백준 [2493] kotlin  (0) 2023.01.11
백준 [20437] kotlin  (0) 2023.01.10
백준 [2531] kotlin  (0) 2023.01.09