알고리즘(백준)/투포인터

[알고리즘/투 포인터] 2470번 : 두 용액 - python

되다 2024. 2. 28. 23:00

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

 

2470번: 두 용액

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

www.acmicpc.net

 


  • 문제
  • 소요시간: 34분 47초


  • 설계하기(접근방법) 

1. 입력받기

배열을 입력받는다

 

2. 구현하기

먼저 배열을 정렬해준다

 

그래야 가장 큰값과

가장 작은 값을 더하면서 비교할 수 있다

 

최소값은 sys.maxsize로 선언해준다

 

그 후 양 끝을

p1 = 시작점 index = 0

p2 = 끝점 index = n - 1

로 잡는다

 

그 둘을 더해본다

그것의 절대값과

최소값을 비교를하여 

더 작다면 갱신해준다

 

그 후 만약 

num_list[p2] - num_list[p1] 가 양의 값이라면

p2의 크기가 컸던 것이니

p2 를 1 줄여준다

 

반대로 음의 값이라면

p1의 크기가 작았던 것이니

p1를 +1 옮겨준다   

 

둘의 합이 0이라면 그 자체가 최소값이니 break를 해준다

 

이 방식으로 p1 = p2일 때까지 진행해준다

 

 

 

3. 출력하기

더해서 최소값인 두 수를 출력한다

 


  • 코드(출력)
import sys

n = int(input())

n_list = list(map(int, input().split()))

n_list.sort()

small = [sys.maxsize, 0, 0]

p1 = 0
p2 = n -1 
# 이게 양수면 양수쪽 -1
p2 - p1
# 이게 음수면 음수쪽 + 1
while True:
    if p1 == p2:
        break
    diff = n_list[p2] + n_list[p1]
    if abs(diff) < small[0]:
        small = [abs(diff), n_list[p1], n_list[p2]]
    # 양수 쪽이 크다면
    if diff > 0:
        p2 -= 1
    # 음수 쪽이 크다면
    elif diff < 0:
        p1 += 1
    # 차이가 0이라면
    else:
        small = [0, n_list[p1], n_list[p2]]
        break
print(small[1], small[2])

  • 얻어갈 부분

1. while문을 True로 선언하고 안에 이중 while문을 넣지 않아 깔끔하게 풀 수 있었다