Problem
https://www.acmicpc.net/problem/2470
2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
About Problem
두 용액을 합하여 0에 가까운 수를 만드는 문제이다.
input이 2이상 100,000 이므로 완전탐색은 할 수 없다. 정렬을 통해서 조건을 통해서 양끝을 줄여가면 빅오 N으로 값을 찾을 수 있다. 이 방식이 바로 two pointer다. 이 문제와 같이 two pointer는 두 값을 비교해서 특정 조건을 찾을 때 자주 쓰인다.



Code
from sys import stdin
# 입력받기
N = int(stdin.readline())
lst = list(map(int, stdin.readline().split()))
# 정렬하기
lst.sort()
# two pointer 시작점과 끝점
s, e = 0, N-1
# min_num 값을 가장 큰 값으로 대입함
min_num = int(4e9)
# 투포인터 방식(끝값이 시작값보다 클때만 계속 돌게하기)
while e > s:
# 두 값을 합한 total 값을 min_num과 비교
total = lst[s] + lst[e]
# 만약 min_num보다 작으면 갱신
if abs(total) < min_num:
min_num = abs(total)
answer = [lst[s], lst[e]]
# total이 0보다 크거나 같을 경우에는 e 값을 1씩 빼주면서 비교하기
if total >= 0:
e -= 1
# total이 0보다 작을 경우에는 s 값을 1씩 더해주면서 비교하기
elif total < 0:
s += 1
print(*answer)
'알고리즘 > 알고리즘 공부(python)' 카테고리의 다른 글
프로그래머스_오픈채팅방/Using(Python_파이썬) (0) | 2022.06.30 |
---|---|
백준_10866_덱/Using(파이썬/Python) (0) | 2022.06.28 |
백준_3273_두 수의 합/Using_파이썬_Python (0) | 2022.06.27 |
백준_1920_수찾기/Using_Python_파이썬 (0) | 2022.06.26 |
백준_2798_블랙잭/Using_python_파이썬 (0) | 2022.06.25 |