정리정돈

[백준 2470] 두 용액 (Python) 본문

알고리즘/백준

[백준 2470] 두 용액 (Python)

XZXXZX 2022. 3. 24. 16:45
728x90
반응형

https://www.acmicpc.net/problem/2470

 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net

나의 풀이(실패)

 

n = int(input())
INF = int(1e9)
li = list(map(int,input().split()))
li = sorted(li)
min_sum = INF
for i in li:
  temp = li.copy()
  temp.remove(i)
  start = 0
  end = len(temp)
  while start < end:
    mid = (start + end)//2
    if i < 0 and abs(i + temp[mid]) < min_sum:
      min_sum = abs(i + temp[mid])
      end = mid - 1
      answer = [i, temp[mid]]
    elif i < 0 and abs(i + temp[mid]) > min_sum:
      start = mid + 1
    elif i > 0 and abs(i + temp[mid] < min_sum):
      min_sum = abs(i + temp[mid])
      start = mid + 1
      answer = [i, temp[mid]]
    elif i > 0 and abs(i + temp[mid] > min_sum):
      end = mid - 1
print(sorted(answer))

 

시간 초과가 나게 되었다.

 

투포인터 활용 문제 풀이

n = int(input())
INF = int(2e9) + 1
li = list(map(int,input().split()))
li = sorted(li)
min_sum = INF
start = 0
end = n -1
answer = []
while start < end:
  if abs(li[start] + li[end]) < min_sum:
    answer = [li[start], li[end]]
    min_sum = abs(li[start] + li[end])
  if li[start] + li[end] < 0:
    start += 1
  else:
    end -= 1
print(' '.join(list(map(str,answer))))

 

INF 를 int(2e9) +1로 사용한 이유는 문제의 조건에서 이 수들은 모두 -1,000,000,000 이상 1,000,000,000 이하라고 하였고  산성 용액만으로나 알칼리성 용액만으로 입력이 주어지는 경우도 있을 수 있다고 하였기 때문에 최소 -2,000,000,000 최대 2,000,000,000이기 때문이다. 

 

참고 블로그 : https://bladejun.tistory.com/97

 

백준 2470번 두 용액 (python, 파이썬)

문제 KOI 부설 과학연구소에서는 많은 종류의 산성 용액과 알칼리성 용액을 보유하고 있다. 각 용액에는 그 용액의 특성을 나타내는 하나의 정수가 주어져있다.  산성 용액의 특성값은 1부터 1,00

bladejun.tistory.com

 

728x90
반응형