문제 이해 & 기본 개념
- 배열의 원소 중 2개의 합이 0에 가장 가까운 원소 쌍을 찾는 문제
- 투 포인터를 이용하면 쉽게 구할 수 있다.
중요 포인트
- 두 개의 포인터를 양 쪽 끝에서 시작하는게 포인트
최종 풀이
- 두 개의 포인터를 각각 배열의 맨 앞과 맨 뒤에 배치한다.
- 왼쪽 포인터를 당기는 경우 or 오른쪽 포인터를 당기는 경우 중 0에 더 가까워 지는 쪽으로 포인터를 이동한다.
cur = abs(num[i] + num[j]) // 현재 두 원소의 합
if(cur >= abs(num[i+1] + num[j])) i++ // 왼쪽 포인터(i)를 당기는게 0에 가까워지는 경우
else j-- // 오른쪽 포인터(j)를 당기는게 0에 가까워지는 경우
소스 코드
import java.util.*
import kotlin.math.abs
fun solve(n:Int, num:List<Int>):Pair<Int, Int>{
var i = 0
var j = n-1
var min = abs(num[i] + num[j])
var minPair = Pair(num[i], num[j])
while(i < j){
var cur = abs(num[i] + num[j])
if(min >= abs(cur)){
min = abs(cur)
minPair = Pair(num[i], num[j])
}
cur = abs(num[i] + num[j])
if(cur >= abs(num[i+1] + num[j])) i++
else j--
}
return minPair
}
fun main(){
val n = readln().toInt()
val st = StringTokenizer(readln())
val num = mutableListOf<Int>().apply {
while (st.hasMoreTokens()) add(st.nextToken().toInt())
}
println(solve(n, num).run { "$first $second" })
}
'BOJ' 카테고리의 다른 글
[ 백준 9466 ] - 텀 프로젝트 (Kotlin) (0) | 2023.02.22 |
---|---|
[ 백준 2239 ] - 스도쿠 (Kotlin) (0) | 2023.02.21 |
[ 백준 2166 ] - 다각형의 면적(Kotlin) (0) | 2023.02.14 |
[ 백준 1463 ] - 1로 만들기 (Kotlin) (0) | 2023.02.13 |
[ 백준 11055 ] - 가장 큰 증가 부분 수열 (Kotlin) (0) | 2023.02.11 |