작은 지식주머니
백준 파이썬 2470 두 용액 본문
https://www.acmicpc.net/problem/2470
2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net

import sys
n = int(input())
s = list(map(int,input().split()))
s.sort()
start = 0
end = len(s) - 1
answer = [[0,0]]
c = sys.maxsize
while start < end:
_sum = s[start] + s[end]
if abs(_sum) <= c:
c = abs(_sum)
answer.pop()
answer.append([s[start],s[end]])
if _sum > 0:
end -= 1
elif _sum < 0:
start += 1
elif _sum == 0:
break
print(answer[0][0],answer[0][1])
이분탐색, 투 포인터 문제
[-99 -2 -1 4 98] 이라는 수열이 존재한다면
맨 처음과 끝 숫자를 더한 변수 _sum을
변수 c 와 abs(_sum)을 비교해가며 start를 늘릴지 end를 줄일지 선택하면 된다.
만약 _sum > 0 이라면 양의 수를 줄이면 되기 떄문에 end를 줄이면 되고
sum < 0 이라면 음의 수를 늘리면 되기 떄문에 start을 늘리면 된다.
또한 특성값이 0과 가까이 되는 결과값이 여러개 라면 그냥 아무거나 출력해도 된다는 조건이 있기때문에
_sum 값이 0 이라면 그대로 while문을 끝내고 결과값을 출력
ex ) 우선 [-99 -2 -1 4 98] , _sum = -1 start += 1, c = 1
[-99 -2 -1 4 98] , _sum = 96, end -= 1, c = 1
[-99 -2 -1 4 98] , _sum = 2, end -= 1, c = 1
[-99 -2 -1 4 98] , _sum = -3, start += 1, c = 1
조건에 벗어나므로 while문 break
답은 [-99,98]
'백준 python 기록' 카테고리의 다른 글
백준 파이썬 13023 ABCDE (0) | 2022.02.22 |
---|---|
백준 파이썬 11000 강의실 배정 (0) | 2022.02.20 |
백준 파이선 2110 공유기 설치 (0) | 2022.01.27 |
백준 파이썬 1068 트리 (0) | 2022.01.26 |
백준 파이썬 11054 가장 긴 바이토닉 부분 수열 (0) | 2022.01.25 |