용액 2467

    

 용액 2467

https://www.acmicpc.net/problem/2467

아래와 같이 풀면 안됨

완전 착각해버림

하나씩 돌아가면서 그 수에 맞는 수를 투포인터 이분탐색으로 찾아가면서 하면되는 건줄알았는데. 실제로 그렇게 해서 풀었는데

그게 아니라 이분탐색 투포인터하는 과정중에 찾아지는 거였다.

그냥 불필요한 과정을 더 한것.

```python

import math


N=int(input())

liquids=list(map(int,input().split()))


pointer_a=0

pointer_b_r=pointer_a+1

pointer_b_l=len(liquids)-1

pointer_b=pointer_b_l

best_a,best_b=pointer_a,pointer_b


for i in range(0,len(liquids)-1):

    pointer_a=i

    pointer_b_l=pointer_a+1

    pointer_b_r=len(liquids)-1

    pointer_b=pointer_b_l


    while pointer_b_l<pointer_b_r:

        mid=int((pointer_b_r+pointer_b_l)/2)

#         print(pointer_a,pointer_b_l,pointer_b_r,mid)


        if pointer_b_l+1==pointer_b_r:

            if abs(liquids[pointer_a]+liquids[pointer_b_l])<abs(liquids[pointer_a]+liquids[pointer_b_r]):

                pointer_b_r=pointer_b_l

                break

            else:

                pointer_b_l=pointer_b_r

                break

        elif liquids[pointer_a]+liquids[mid]<0:

            pointer_b_l=mid

        elif liquids[pointer_a]+liquids[mid]>0:

            pointer_b_r=mid

        elif liquids[pointer_a]+liquids[mid]==0:

            pointer_b_r=mid

            pointer_b_l=mid

            break

    pointer_b=pointer_b_r

    if abs(liquids[pointer_a]+liquids[pointer_b])<=abs(liquids[best_a]+liquids[best_b]):

        best_a,best_b=pointer_a,pointer_b


        

        

# print(best_a,best_b)


print(liquids[best_a],liquids[best_b])

```


### 모범 답안


```python

N = int(input())

liquids = list(map(int, input().split()))


left = 0

right = N - 1

best_sum = float('inf')

best_pair = (liquids[left], liquids[right])


while left < right:

    current_sum = liquids[left] + liquids[right]


    # 0에 더 가까운 값을 찾는 경우

    if abs(current_sum) < abs(best_sum):

        best_sum = current_sum

        best_pair = (liquids[left], liquids[right])


    # 합이 0보다 작으면 left 포인터를 오른쪽으로 이동

    if current_sum < 0:

        left += 1

    # 합이 0보다 크면 right 포인터를 왼쪽으로 이동

    elif current_sum > 0:

        right -= 1

    else:

        break  # 합이 정확히 0이면 더 이상 탐색할 필요 없음


print(best_pair[0], best_pair[1])

```




댓글

이 블로그의 인기 게시물

js 스트링에서 요소 갯수 세기

STUDY

javascript cheatsheet