https://www.acmicpc.net/problem/2473
2473번: 세 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상
www.acmicpc.net
풀이
투포인터 문제인 용액 시리즈이다.
3개의 용액의 값을 합한 값이 최대한 0에 가깝게 나오도록 용액을 고른 뒤. 값을 오름차순으로 출력하는것이 문제의 목표이다.
1개의 용액은 완전탐색을 통해서 뽑고 나머지 2개의 용액은 투 포인터로 뽑아줄 것이다.
투 포인터 알고리즘
https://sunghyun98.tistory.com/25
[알고리즘] 투 포인터
투 포인터 알고리즘은 배열에서 두 개의 포인터를 사용하여 특정 목표를 달성하기 위한 기법입니다. 일반적으로 정렬된 배열에서 특정 조건을 충족하는 요소를 찾거나 연속된 서브 배열의 합과
sunghyun98.tistory.com
코드
# 2473번 세 용액
# 투포인터와 완전탐색 사용.
import sys
n = int(input())
liquid = list(map(int, input().split()))
# 정렬이 안되어있기에 정렬 우선.
liquid.sort()
min_sumOfLiquid_2 = sys.maxsize
ans = []
if n == 3:
print(*liquid)
else:
# 남은 용액이 3개밖에 없을 경우. 더 이상 pop하지 않는다.
for i in range(n-2):
tmp = liquid.pop()
start = 0
end = len(liquid)-1
while start < end:
sumOfLiquid_2 = liquid[start] + liquid[end] + tmp
if abs(sumOfLiquid_2) < min_sumOfLiquid_2:
min_sumOfLiquid_2 = abs(sumOfLiquid_2)
ans = [liquid[start], liquid[end], tmp]
if sumOfLiquid_2 > 0:
end -= 1
else:
start += 1
if sumOfLiquid_2 == 0:
break
if sumOfLiquid_2 == 0:
break
print(*ans)
출력결과
'백준 > 투 포인터' 카테고리의 다른 글
[백준][Python] 1253번 좋다 - 코팩 (0) | 2023.08.20 |
---|---|
[백준][Python] 14921번 용액 합성하기 - 코팩 (0) | 2023.08.14 |
[백준][Python] 3649번 로봇 프로젝트 - 코팩 (0) | 2023.08.11 |
[백준][Python] 2470번 두 용액 - 코팩 (0) | 2023.08.09 |
[백준][Python] 2467번 용액 - 코팩 (0) | 2023.08.09 |