728x90
import sys
n = int(sys.stdin.readline())
number = list(map(int, sys.stdin.readline().split()))
x = int(sys.stdin.readline())
number.sort()
start, end = 0, n-1
cnt, tmp = 0, 0
while start < end:
tmp = number[start] + number[end]
if tmp < x:
start += 1
elif tmp > x:
end -= 1
else:
cnt += 1
start += 1
end -= 1
print(cnt)
투 포인터 문제인데 start 포인터와 end 포인터의 초기값이 왜 리스트의 시작과 끝을 가리키는지 이해해야 한다.
문제에서 ai + aj = x이고 범위는 (1 <= i < j <= n)이기 때문에 정렬된 리스트에서 끝과 끝에서 하나 하나 비교하며 모든 쌍을 만족해야하고 start포인터가 end포인터보다 크면 안된다.
두 지점의 합을 구하는 문제이기 때문에 부분수열의 누적합이 아니어서 끝과 끝에서 서로를 향해 가까워지며 반복문을 수행해야한다.
728x90
'[Coding Test] > [백준]' 카테고리의 다른 글
[백준] 1037 파이썬(python) : 약수 (0) | 2022.09.27 |
---|---|
[백준] 2902 파이썬(python) : KMP는 왜 KMP일까? (0) | 2022.09.26 |
[백준] 2003 파이썬(python) : 수들의 합 2 (0) | 2022.09.24 |
[백준] 1940 파이썬(python) : 주몽 (0) | 2022.09.22 |
[백준] 2018 파이썬(python) : 수들의 합 5 (0) | 2022.09.22 |