IT recording...
[BOJ] 2470 두 용액 - python 본문
풀이
|
import sys
def input():
return sys.stdin.readline().rstrip()
N = int(input()) #2<= N <=100,000
liquid = sorted(list(map(int,input().split(" "))))
#print(liquid)
#임의의 두 개를 더해서 0에 가장 가까운 값을 만들어야 함
#다 하는 것 밖에 답이 없는데 그러면 시간 초과가 뜸
#이진 탐색?
#적합 : 음수? 양수?
start = 0
end = len(liquid)-1
s,e = -1,-1
abs_min = float('inf')
while start < end: #두 용액이 같을 수 없으니 등호는 제외
fit = liquid[start] + liquid[end]
if abs_min > abs(fit): #최솟값이면 갱신
s, e = start, end
abs_min = abs(fit)
if fit == 0:
break
else:
if fit > 0: #양수가 더 크다는 것이므로 오른쪽 -1
end -= 1
else: #음수가 더 크다는 것이므로 왼쪽 +1
start += 1
print(liquid[s], liquid[e])
얻어가는 것
- 투포인터
#투 포인터 start, end설정 start = 0 end = len(arr) -1 while start < end: #두 포인터가 같지 않아야 할 때는 등호를 뺀다 #start,end를 가지고 function 실행 if function(start,end) == goal: break else: if function(start,end) > goal: end = mid - 1 #왼쪽만 살림, 오른쪽 제거 else: start = mid + 1 #오른쪽만 살림, 왼쪽 제거
- → 정렬되어 있는 리스트에서 , N이 엄청나게 큰 수 일 때, 두 개의 포인터를 가지고 , 특정 기준에 따라 데이터를 탐색할 때
느낀점
"211116"
소요 시간 : 1h
- 이진탐색에서 mid이용하는걸로만 생각했는데 이건 투포인터 문제였다
- 머리가 터질 것 같다
- 조건을 어떤 식으로 검색하면 좋을 지 기준을 잘 세우는 연습을 해야겠다
'Algorithm' 카테고리의 다른 글
[BOJ] 2096 내려가기 - python (0) | 2021.12.02 |
---|---|
[BOJ] 1806 부분합 - python (0) | 2021.12.02 |
[BOJ] 2805 나무 자르기 - python (0) | 2021.12.02 |
[BOJ] 1062 가르침 - python (0) | 2021.12.02 |
[BOJ] 11660 구간 합 구하기 5 - python (0) | 2021.12.02 |
Comments