[Python] 백준 / gold / 2470 : 두 용액

김상우·2021년 12월 27일
0
post-custom-banner

문제 링크 : https://www.acmicpc.net/problem/2470

투 포인터 문제를 풀 때는 for 문으로 start 를, 그 안에 while 문으로 end 를 조작한다고 기억해두고 있었다. 공식은 아니지만 그게 편해서. 근데 이 문제를 풀고나니까 꼭 그렇지만은 않다고 생각이 들었다.

투 포인터 문제는 말그대로 두 개의 포인터를 조작하는 알고리즘을 생각해야 되기 때문에, 무조건 이렇다라고 생각하면 안될 것 같다.

이 문제에서는 용액을 sort 하고, left 와 right 두 개의 포인터를 각각 양쪽 끝에서 시작해서 가운데로 모아지는 로직을 생각해야 된다.

그래서 while left < right 로 투 포인터를 다뤄야된다.
이제 투 포인터 문제를 풀 때, 기본적으로는 for ~ while 문을 사용하지만, 항상 그런건 아니라고 기억해야겠다.


파이썬 코드

import sys
N = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))
arr.sort()

left = 0
right = N-1
answer = [arr[left], arr[right]]

while left < right:
    result = abs(arr[left] + arr[right])

    if left+1 < right and abs(arr[left+1] + arr[right]) < result:
        left += 1
    elif left < right-1 and abs(arr[left] + arr[right-1]) < result:
        right -= 1
    else:
        if result < abs(sum(answer)):
            answer = [arr[left], arr[right]]
        left += 1
        right -= 1

print(answer[0], answer[1])
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.
post-custom-banner

0개의 댓글