프로그래밍/Python

[Python] 백준 2470 두 용액

모영이 2021. 2. 15. 18:29

 

2470번: 두 용액

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

www.acmicpc.net

투포인터

 

1) 용액 배열을 오름차순으로 정렬한다.

2) sp는 제일 왼쪽 인덱스 출발, ep는 제일 오른쪽 인덱스 출발

3) sp가 ep보다 커지거나 서로 만나면 while문 종료

4) 합쳐질 용액의 값 두개와 합의 절댓값을 계속 저장하고, 합이 > 0 이면 ep를 -1하고, 합이 < 0이면 sp를 +1 한다.

-> 0보다 크면 합을 더 작게 만들어야 하기에 오른쪽 포인터를 왼쪽으로 한칸 옮기고 

-> 0보다 작으면 합을 더 크게 만들어야 하기에 왼쪽 포인터를 오른쪽으로 한칸 옮긴다.

-> 0이면 바로 탈출

5) 절댓값을 기준으로 정렬하고, 합쳐졌던 용액의 값 두개를 출력한다.

 

전체 코드

import sys
input = sys.stdin.readline

N = int(input())
yongaeks = list(map(int, input().split()))
yongaeks.sort()

sp = 0
ep = len(yongaeks) - 1
sum_yongaeks = []
while sp < ep:
    sum = yongaeks[sp] + yongaeks[ep]
    tmp = [yongaeks[sp],yongaeks[ep],abs(sum)]
    sum_yongaeks.append(tmp)
    if sum > 0:
        ep -= 1
    elif sum < 0:
        sp += 1
    else:
        break

sum_yongaeks.sort(key= lambda x : x[2])
print(sum_yongaeks[0][0], sum_yongaeks[0][1])

'프로그래밍 > Python' 카테고리의 다른 글

[Python] 백준 1504 특정한 최단 경로  (0) 2021.02.16
[Python] 백준 11404 플로이드  (0) 2021.02.16
[Python] 백준 11399 ATM  (0) 2021.02.15
[Python] 백준 11047 동전0  (0) 2021.02.15
[Python] 백준 10773 제로  (0) 2021.02.15