https://www.acmicpc.net/problem/2470
두 용액을 혼합하여 0에 가까운 용액을 만들기 위해 2개의 용액을 골라야 하는 문제이다
해당 문제의 조건은 N 이 2 이상 100,000 이하인데 시간 제한은 1초이기 때문에
완전탐색으로 풀게 되면 시간 초과가 나는 문제이다...
여러가지 방법이 있을테지만 두 용액을 골라 더해야하기 때문에 투 포인터로 문제를 풀게되었다
let input = Int(readLine()!)!
let nArray = readLine()!.split(separator: " ").map{Int($0)!}.sorted()
var location = (0, 0)
var closeSum = Int.max
var start = 0
var end = input-1
while start < end {
let sum = nArray[start] + nArray[end]
if sum == 0 {
print(nArray[start], nArray[end])
break
} else if abs(sum) < closeSum {
closeSum = abs(sum)
location = (start, end)
}
if sum < 0 {
start += 1
} else if sum > 0 {
end -= 1
}
}
print(nArray[location.0], nArray[location.1])
투 포인터로 풀어야 했기 때문에 start
와 end
포인터를 선언해주었고 배열의 시작점과 끝점으로 설정을 해주었다
여기서 중요한건 두 용액의 합이 0에 가까운 용액을 출력해주어야 하는데 어떻게 해야하나 고민이 많았다....
두 용액의 합이 음수일 수도 양수일 수도 있기 때문에 크기만을 비교하기 위해선 절대값으로 비교해야 풀 수있겠다 생각이 들었고
두 용액의 합이 0일 때는 빠르게 끝내기 위해 break 를 걸어주었고
비교할 변수 closeSum 에 Int 최대값을 넣고 계속 비교하도록 했다
투 포인터의 핵심인 인덱스를 계속 바꿔주어야 하는데 합이 0보다 작으면 음수 값이 더 크다는 의미기 때문에 0에 가깝게 하기 위해선 start 포인터를 증가시키고
양수라면 0보다 큰 값이기 때문에 end 포인터를 감소시켜 0에 가깝게 해야만한다