n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는 (ai, aj)쌍의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 수열의 크기 n이 주어진다. 다음 줄에는 수열에 포함되는 수가 주어진다. 셋째 줄에는 x가 주어진다. (1 ≤ n ≤ 100000, 1 ≤ x ≤ 2000000)

출력

문제의 조건을 만족하는 쌍의 개수를 출력한다.

예제 입력 1 복사

9
5 12 7 10 9 1 2 3 11
13

예제 출력 1 복사

3

 

문제풀이

오름 차순으로 숫자를 정렬한다

left = 0

rifht = n - 1 에서 시작하며 -> <- 형태로 이동한다

m보다 sum_nums가 작다면 왼쪽 포인터가 ->로 이동

그렇지 않은 일반적인 경우에는 오른쪽 포인트가 <- 이동

import sys

n = int(input())
data = list(map(int, input().split()))
m = int(input())
count = 0

#left --> <-- right 이동
left, right = 0, n - 1
#정렬 해두고 시작
data.sort()
while left < right :
    sum_nums = data[left] + data[right]

    #m과 같은 경우에는 카운트 증가
    if sum_nums == m :
        count += 1
    
    #m보다 sum_nums이 작은 경우에 왼쪽 포인터가 -> 이동
    if sum_nums < m :
        left += 1
        continue
    #일반적인 경우 오른쪽 포인터가 <- 이동
    right -= 1

print(count)
[백준 : 실버3] 3273번: 두 수의 합(투포인터 --> <-- 이동)