Algorithm/BOJ
백준 2473 세 용액
삼쓰 웅쓰
2021. 5. 3. 10:06
728x90
출처: www.acmicpc.net/problem/2473
분류: 투포인터
접근방식
두 개의 포인터로 찾는 문제가 일반적인데 이번엔 세 개의 합을 찾아야 했습니다.
먼저 하나를 정해놓고 나머지 부분에서 일반적인 투포인터 방식으로 접근하면 해결할 수 있습니다.
처음에 정한 것 외에 2개가 더 필요하니 0..<n-2 까지 반복합니다.
해결방법
// MARK: 2473 세 용액
let n = Int(readLine()!)!
let arr = readLine()!.split(separator: " ").map({ Int(String($0))! }).sorted()
var closeSet = [Int]()
var closeZero = 10_000_000_000
loop: for i in 0..<n-2 {
var start = i+1
var end = n-1
while start < end {
let sum = arr[i] + arr[start] + arr[end]
if abs(sum) < closeZero {
closeZero = abs(sum)
closeSet = [arr[i], arr[start], arr[end]]
}
if sum == 0 {
break loop
} else if sum > 0 {
end -= 1
} else {
start += 1
}
}
}
print("\(closeSet[0]) \(closeSet[1]) \(closeSet[2])")
배운점
처음에는 sum이 0보다 작을 때 p1, p2가 붙어있으면 p2를 아니면 p1을 움직여서 3개를 한 번에 다 움직이려고 했는데 이렇게 하면 모든 케이스를 다 생각해줄 수가 없게된다..!!