백준 > 두 용액

SeiLyn·2023년 11월 15일

백준

목록 보기
5/17

❓ 문제

백준 골드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이 나와버리게 된다.

0개의 댓글