N
: 전체 용액의 수 ()
values
: N
개 용액의 특성값 ()
3가지 용액을 혼합해 특성값이 0에 가장 가까운 용액 3가지의 특성값을 출력하는 문제이다.
출력 조건은 다음과 같다.
1. 오름차순 출력
2. 0에 가장 가까운 용액 만들어내는 경우 2개 이상 → 아무거나 1개 출력
⭐️ 특성값 구하기
- 특성값
- 혼합에 사용된 각 용액의 특성값의 합
- 알칼리성 용액만 사용 또는 산성 용액만 사용 🆗
N
의 범위가 이고,
특성값의 범위가 로 매우 크다.
이 범위의 값을 하나하나 탐색한다면 시간 초과가 날 것이다.
따라서 시간복잡도를 효율적으로 줄일 수 있는 알고리즘이 필요하다.
→ 투 포인터(Two Pointer) 활용‼️
투 포인터 구현
left
, right
로 정의left
값 증가 (더 큰 수로 이동)right
값 감소 (더 작은 수로 이동)left
가 right
와 같거나 더 커질 경우오름차순 정렬 →
투 포인터 탐색 →
최종 시간복잡도
가 된다.
최악의 경우 이 되어 제한 시간 1초 내에 연산이 가능하다.
투 포인터로 선택할 용액 범위 좁혀서 탐색
틀렸습니다
가 나왔다.import sys
input = sys.stdin.readline
# N 입력
N = int(input())
# N개 용액 특성값 입력
values = list(map(int, input().split()))
# 오름차순 정렬
values.sort()
# 결과 저장 리스트 정의
answer = []
# 합 큰 수로 정의
sum = 5000000000
# 투 포인터 구현
for i in range(N - 2):
# 2개의 용액 지정
left, right = i + 1, N - 1
# 투 포인터 구현
while left < right:
# 현재 합 계산
temp = values[i] + values[left] + values[right]
# 합의 절댓값 비교해 더 작으면 저장
if abs(temp) < sum:
# 합 갱신
sum = abs(temp)
# 정답 갱신
answer = [values[i], values[left], values[right]]
# 탐색 범위 좁히기
if temp < 0: # 더 큰 수로 이동
left += 1
elif temp > 0: # 더 작은 수로 이동
right -= 1
else: # 가장 0에 가까운 경우로 바로 종료
break
# 결과 출력
print(*answer)