백준 2467번 - 용액

@ckdhkdwns · April 22, 2023 · 2 min read

백준 2467번 - 용액
https://www.acmicpc.net/problem/2467

풀이

문제의 목표는 두 개의 용액을 혼합했을 때, 혼합된 용액의 특성값이 0에 가장 가깝도록 하는 것입니다. 이 문제는 투 포인터 알고리즘을 사용하여 해결할 수 있습니다.

  1. 용액의 개수(n)와 각 용액의 ph값을 입력 받습니다. 이 때 ph값은 용액의 특성값을 말합니다.
  2. 두 포인터 leftright를 초기화합니다. left는 처음 위치에, right는 마지막 위치에 두고 시작합니다.
  3. 현재 leftright가 가리키는 용액을 혼합한 ph값을 구하고, 그 값이 최소 ph값인지 확인합니다. 만약 최소라면, 최소 ph값과 이 때의 두 용액의 값(left_ph, right_ph)을 저장합니다.
  4. 두 용액을 혼합한 ph값이 0보다 작으면 left를 1 증가시키고, 0보다 크면 right를 1 감소시킵니다. 이렇게 하면 혼합된 용액의 ph값이 0에 더 가까워지는 것을 찾을 수 있습니다.
  5. leftright보다 작을 때까지 위 과정을 반복합니다. 만약 혼합된 용액의 ph값이 정확히 0이면, 최적의 해를 찾은 것이므로 반복을 종료합니다.
  6. 최종적으로 선택된 두 용액의 ph값을 출력합니다.

코드

# 2467번 용액
import sys

n = int(sys.stdin.readline())
ph = list(map(int, sys.stdin.readline().split()))

left = 0
right = n - 1 

min_ph = abs(ph[left] + ph[right])

left_ph = ph[left]
right_ph = ph[right]
  
while left < right:
  p = ph[left] + ph[right]
  if abs(p) < min_ph:
    min_ph = abs(p)
    left_ph = ph[left]
    right_ph = ph[right]
    
  if p < 0:
    left += 1
  elif p > 0:  
    right -= 1
  else:
    break

print(left_ph, right_ph)
@ckdhkdwns
developer blog