Algorithms

[baekjoon]세 용액 - Python

짤진이 2024. 5. 4. 19:12
반응형

문제 링크

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

 

문제 이해

이분 탐색 문제이다.

처음에는 왼쪽 포인터와 오른쪽 포인터를 설정한 후 가운데 값에서 나머지 한 값을 찾으려고 했다.

하지만 전체 범위를 0부터 (n-2)로 지정한 후 처음 i 값에서 1을 더한 값을 왼쪽 포인터로 두고 n-1을 오른쪽 포인터로 둔다.

 

🎱 범위가 n-2인 이유 => 왼쪽 포인터와 오른쪽 포인터를 포함해야 하므로 마지막 인덱스 값을 n-2로 두어야

     왼쪽 포인터, 오른쪽 포인터 각 1개씩 설정할 수 있기 때문이다.

 

가장 왼쪽 값을 now_val = liquid[i]로 지정해둔 후 왼쪽 포인터를 i+1, 오른쪽 포인터를 n-1로 설정한다.

값이 0보다 크면 right_p를 -1하고 값이 0보다 작으면 left_p를 +1한다.

절댓값으로 비교한 후 값이 작을 때마다 res 리스트를 업데이트 해준다.

세 수의 합이 0일 시에는 바로 print한 후 sys.exit()로 종료하고 for문이 종료되면 res를 출력하여 0에 가장 가까운 값을 출력한다. 

 

코드

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

liquid.sort()
tmp = 3000000000
for i in range(n-2):
  now_val = liquid[i]
  left_p = i + 1
  right_p = n - 1

  while left_p < right_p:
    tmp_sum = now_val + liquid[left_p] + liquid[right_p]
    if abs(tmp_sum) <= abs(tmp) :
      tmp = tmp_sum
      res = [now_val, liquid[left_p], liquid[right_p]]
    if tmp_sum > 0:
      right_p -= 1
    elif tmp_sum < 0:
      left_p += 1
    else:
      print(*res)
      sys.exit()
print(*res)
반응형