Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

작은 지식주머니

백준 파이썬 2470 두 용액 본문

백준 python 기록

백준 파이썬 2470 두 용액

작지 2022. 1. 29. 14:21

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]

 

 

Comments