매일을 설렘으로

[Python] 백준 2470번 두 용액 문제 본문

알고리즘

[Python] 백준 2470번 두 용액 문제

하루설렘 2021. 11. 15. 10:39

백준 2470번 두 용액 문제를 접근하는데 이진탐색으로 못 풀고 투 포인터라는 방법으로 풀었다. 

 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net


 

나의 풀이

선형탐색으로는 O(N^2)으로 시간초과가 될 것이니, 이분탐색이나 투포인터라는 알리고즘?으로 풀어야한다. 절대값이 0에 가까운 두 값의 조합을 찾기 위해서 두 조합의 합이 음수이면 왼쪽 원소의 절대값이 너무 크다를 의미하고, 양수라면, 오른쪽 원소의 절대값이 너무 크기 때문에 그에 맞게 두 원소의 idx값을 조절하면 된다.  


 

import sys
INF = sys.maxsize

n = int(input())

arr = list(map(int, input().split()))
arr.sort()

start = 0
end = len(arr) - 1

pair = []
min_val = INF
while start < end:
    total = arr[start] + arr[end]
    # 둘 간의 합을 기존과 비교해 작은걸 채택하고, 두 용액의 산성도도 별도 변수에 저장
    if abs(total) < min_val:
        min_val = abs(total)
        pair = (arr[start], arr[end])

    if total >= 0:
        end -= 1
    else:
        start += 1

print(*pair)

 

시간 복잡도

포인터가 서로 엇갈려 start 인덱스가 edn 인덱스를 넘어서면 반복문이 멈추게 되어있으므로 시간 복잡도는 O(N)이다.


 

 

 

Two pointers algorithm

https://butter-shower.tistory.com/226

 

[Algorithm] 투포인터(Two Pointer) 알고리즘

알고리즘 문제를 풀다보면 종종 나오는 투포인터 알고리즘! 막 꼬여가지고 ㅋㅋㅋ 저도 중간에 제대로 못짜고 그러는 경우가 많은데요, 많은 코딩테스트 문제에 등장하는 것은 아니지만 잊을만

butter-shower.tistory.com

https://m.blog.naver.com/kks227/220795165570

 

투 포인터(Two Pointers Algorithm), 슬라이딩 윈도우(Sliding Window) (수정: 2019-09-09)

조금 성향이 비슷하다고 생각하는 기법 2개를 함께 쓰려 합니다. 첫 번째로 소개해드릴 기법은 투 포인터(t...

blog.naver.com