
❓ 문제
백준 골드5 문제 > 두 용액
❗ 해결
전형적인 투포인터 문제다. 용액들이 주어지고, 두 용액을 더해서 0에 가장 가까운 용액을 만들어내면 되는데, 이 때 두 용액의 특성값을 출력하는 문제다.
먼저 전체 용액의 수와, 용액을 입력받는다.
입력받은 용액은 리스트로 만들어준다.
투 포인터를 사용하려면, 정렬을 해줘야 한다.
N = int(input())
sol = list(map(int, input().split()))
sol.sort()
그 뒤 start, end 포인터를 선언한다.
start는 0부터 시작, end는 리스트의 맨 뒤부터 시작한다.
만약 두 용액을 더한 값이 0보다 작으면, start를 1씩 증가시키고, 0보다 큰 경우에는 end를 1씩 감소시킨다.
s = 0
e = len(sol)-1
여기서 핵심은, 두 개의 용액을 더했을 때, 0에 가장 가까운 수를 찾으려면 두 용액을 더한값에 절대값이 가장 작은 수를 찾으면 된다.
처음에 코드를 다 짜놓고 계속 틀려서 한참 고민했는데 정말 간단한 문제였다.
문제에서 용액의 특성값은 1부터 1,000,000,000이므로, 두 용액의 합이 제일 큰 경우는 1,000,000,000 + 1,000,000,000 = 2,000,000,000이 된다.
근데 최소값을 저장해둘 변수를 1,000,000,000으로 초기화를 시키니, [999999995 999999996 999999997 1000000000] 이렇게 입력이 들어오게 되면 계산이 되지 않는 문제가 발생했다..
그래서 최소값을 저장해둘 변수를 2_000_000_001로 다시 선언해서 맞췄다.
N = int(input())
sol = list(map(int, input().split()))
sol.sort()
s = 0
e = len(sol)-1
temp = []
sum_min = 2_000_000_001
min_value = []
while s < e:
if sum_min > abs(sol[s] + sol[e]):
sum_min = abs(sol[s] + sol[e])
min_value = [sol[s], sol[e]]
if sol[s] + sol[e] < 0:
s += 1
else:
e -= 1
min_value.sort()
print(*min_value)
start 포인터가 end 포인터보다 작을 때 까지 반복문을 돌려야 한다. 만약 s <= e 라고 했을 때, 용액 리스트에서 0이 포함되어 있는 경우에는 s = 0, e = 0이 되므로 무조건 0이 나와버리게 된다.
