Post

백준 2470번 두 용액

리스트를 입력 받아서 리스트중 2개의 합이 특정한 값을 찾는 문제로 대표적인 투 포인터 문제이다 여기서는 두개의 합만을 구하므로 부분합을 이용하지 않고 푼다

 

리스트를 입력받아서 서로 다른 두 용액을 섞었을때 0에 가장 가까운 값을 만드는 두 용액을 찾아내야한다

만약 같은 값이 두가지 이상인경우 아무거나 하나를 출력한다 -> 빠르게 하기위해 만약 두수의 0이라면 더이상 진행하지 않고 두수를 출력하고 끝낸다

0에 가깝다는 절대값이 가장 작은 값을 이용한다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import sys
input = sys.stdin.readline

n = int(input())
array = list(map(int,input().split()))
min = 2000000001
min_list = []

#리스트를 입력받아서 서로 다른 두 용액을 섞었을때 0에 가장 가까운 값을 만드는 두 용액을 찾아내시오
#만약 같은 값이 두가지 이상인경우 아무거나 하나를 출력한다

#0에 가깝다-------> 절대값이 가장 작은 값
start = 0
end = n-1
array.sort()

while start < end:
    s = array[start] + array[end]
    if s == 0: #빠른 탈출
        min_list.append([array[start],array[end]])
        break
        
		#절대값을 비교했으므로 그 값이 양수인지 음수인지에 따라 start,end 뭐를 움직일지 결정한다
    if abs(s) < abs(min):
        if s >0:
            min = s
            min_list.append([array[start],array[end]])
            end -= 1
        else:
            min = s
            min_list.append([array[start],array[end]])
            start += 1
        
    else:
        if s > 0:
            end -= 1
        else:
            start += 1
       
    
print(*min_list[-1])# 더 작을 수록 늦게 추가되기 때문에 반복문을 끝내고 마지막에 추가된 것을 출력하면 된다
This post is licensed under CC BY 4.0 by the author.