링크 - https://www.acmicpc.net/problem/2467
#용액 22-02-06
import sys
def solution(n,liquid):
liquid.sort() #정렬하기
start = 0
end=n-1 #마지막
answer=[liquid[start],liquid[end]]
min_val=abs(liquid[start]+liquid[end])
while start<end:
mix = liquid[start]+liquid[end]
if abs(mix)<min_val:
min_val = abs(mix)
answer[0]=liquid[start]
answer[1]=liquid[end]
if mix>0: #end를 앞으로 옮겨준다.
end-=1
elif mix<0: #start를 뒤로 옮겨준다.
start+=1
else:
print(*answer)
return answer
print(*answer)
return answer
if __name__=="__main__":
input = sys.stdin.readline
n = int(input())
liquid = list(map(int,input().split()))
solution(n,liquid)
이분탐색과 투포인터를 사용해서 푸는 문제였다.
입력된 리스트를 정렬한 상태로 진행해야한다.
링크 - https://www.acmicpc.net/problem/2473
#세 용액 22-02-06 이분 탐색
#2467번에서 용액 하나를 추가로 고정시킨다.
import sys
def solution(n,liquid):
liquid.sort() #정렬하기
start =1
end = n - 1 # 마지막
answer = [liquid[0], liquid[start], liquid[end]]
min_val = abs(liquid[0] + liquid[start] + liquid[end])
for fix in range(n-2): #범위 - 3개 골라야 함
start = fix+1 #fix 다음부터 시작
end = n - 1 # 마지막
while start<end:
mix = liquid[fix]+liquid[start]+liquid[end]
if abs(mix)<min_val:
min_val = abs(mix)
answer[0] = liquid[fix]
answer[1]=liquid[start]
answer[2]=liquid[end]
if mix>0: #end를 앞으로 옮겨준다.
end-=1
elif mix<0: #start를 뒤로 옮겨준다.
start+=1
else:
print(*answer)
return answer
print(*answer)
return answer
if __name__=="__main__":
input = sys.stdin.readline
n = int(input())
liquid = list(map(int,input().split()))
solution(n,liquid)
처음에 세 용액 문제를 풀다가 모르겠어서 용액을 푼 뒤 다시 풀었다.
두 용액을 섞었던 앞의 문제에서 세 개로 변형된 문제였다.
로직은 앞의 문제와 똑같으나 고정 값을 추가해서 탐색할 수 있도록 했다. (fix변수)
고정 용액인 fix를 0부터 n-3까지 이동시키면서 나머지 두 용액은 이분탐색과 투포인터를 사용하도록 했다.
.
.
.
이번 기회를 통해서 투포인터를 조금 이해할 수 있었던 것 같다.