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)
'코테풀이 > 투포인터' 카테고리의 다른 글
[프로그래머스 | JS] 두 큐 합 같게 만들기(투포인터) (0) | 2023.01.15 |
---|---|
[프로그래머스 | JS] 구명보트(투포인터) (0) | 2023.01.13 |
[백준 | 실버4] 주몽(정렬, 투포인터) (0) | 2022.08.03 |
[백준 : 골드5] 1806번 부분합(투포인터 ->->) (0) | 2022.05.10 |
[백준 | 실버3] 2003번 수들의 합(투포인터 -> ->이동) (0) | 2022.05.10 |
[백준 : 실버3] 3273번: 두 수의 합(투포인터 --> <-- 이동)