용액 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])
```
댓글
댓글 쓰기