[백준 / Swift] 2470 - 두 용액

박준혁 - Niro·2024년 3월 27일
1

백준

목록 보기
16/16
post-thumbnail

🔗 문제 링크


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])

투 포인터로 풀어야 했기 때문에 startend 포인터를 선언해주었고 배열의 시작점과 끝점으로 설정을 해주었다

여기서 중요한건 두 용액의 합이 0에 가까운 용액을 출력해주어야 하는데 어떻게 해야하나 고민이 많았다....

두 용액의 합이 음수일 수도 양수일 수도 있기 때문에 크기만을 비교하기 위해선 절대값으로 비교해야 풀 수있겠다 생각이 들었고

두 용액의 합이 0일 때는 빠르게 끝내기 위해 break 를 걸어주었고
비교할 변수 closeSum 에 Int 최대값을 넣고 계속 비교하도록 했다

투 포인터의 핵심인 인덱스를 계속 바꿔주어야 하는데 합이 0보다 작으면 음수 값이 더 크다는 의미기 때문에 0에 가깝게 하기 위해선 start 포인터를 증가시키고

양수라면 0보다 큰 값이기 때문에 end 포인터를 감소시켜 0에 가깝게 해야만한다

profile
📱iOS Developer, 🍎 Apple Developer Academy @ POSTECH 1st, 💻 DO SOPT 33th iOS Part

0개의 댓글