반응형
2473번: 세 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상
www.acmicpc.net
문제
풀이
해당 문제는 이전에 용액2467 문제를 풀었기 때문에 투 포인터를 이용한 문제라는 것을 알고 있었습니다.
하지만 선택해야 되는 용액이 3개이기 때문에 약간의 응용만 해주면 됩니다.
결국은 투 포인터를 이용해야 되지만 우리는 3개의 용액을 선택해야 됩니다. 따라서 하나의 용액은 결정되었다는 가정하에 2개의 용액만 투 포인터로 구해주면 됩니다.
(투 포인터 + 완전탐색)
풀이 방법은 다음과 같습니다.
- 용액을 정렬해 준다.
- for 문을 돌면서 i번째 용액을 고정시켜 준다.
- i+1번째 용액부터 마지막 용액까지 투 포인터를 진행시켜 i번째 용액을 더 했을 때 0에 가장 가까운 용액을 찾아준다.
import java.io.StreamTokenizer
fun main() = StreamTokenizer(System.`in`.bufferedReader()).run{
fun input(): Long {
nextToken()
return nval.toLong()
}
val N = input().toInt()
val arr = LongArray(N) {input()}
arr.sort() // 정렬
var min = Long.MAX_VALUE
var result = LongArray(3)
// i번째 용액 고정
for (i in 0 until arr.size-2) {
val standard = arr[i]
var left = i+1
var right = arr.size-1
// 나머지 2개의 용액 투 포인터로 찾음
while (left < right) {
val sum = arr[left] + arr[right]
// 0에 더 가까운 경우 갱신
if (Math.abs(sum + standard) < min) {
result[0] = standard
result[1] = arr[left]
result[2] = arr[right]
min = Math.abs(sum + standard)
}
if (sum + standard < 0) {
left++
} else {
right--
}
if (min == 0L) {
print(result.joinToString(" "))
return
}
}
}
print(result.joinToString(" "))
}
반응형
'코딩테스트 > 백준 코틀린' 카테고리의 다른 글
[백준] 27. 텀 프로젝트 9466 해설 (0) | 2024.01.21 |
---|---|
[백준] 26. 별자리 만들기 4386 해설 (0) | 2024.01.17 |
[백준] 24. Dance Dance Revolution 2342 해설 (0) | 2024.01.14 |
[6개월 안에 백준 플래티넘 달성하기] 23. 두 배열의 합 2143 (0) | 2024.01.11 |
[6개월 안에 백준 플래티넘 달성하기] 22. 소수의 연속합 (0) | 2024.01.10 |
댓글