N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.
N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.
수의 위치가 다르면 값이 같아도 다른 수이다.
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
좋은 수의 개수를 첫 번째 줄에 출력한다.
맨 처음과 맨 끝 포인터 left, right를 설정하고
각 포인터가 가리키는 숫자값을 합한 sum_number를 구하고
찾는 숫자가 search_number일 때
같으면서 left,right 각각이 search_number의 인덱스를 가리키지 않으면
좋은 숫자이므로 True를 반환한다.
sum_number를 작게해야한다 -> right-=1
sum_number를 크게 해야한다 -> left+=1
Input:
10
1 2 3 4 5 6 7 8 9 10
Output:
8
Input:
4
0 0 0 0
Output:
4
import sys
input = sys.stdin.readline
good_count=0
n=int(input())
numbers = list(map(int,input().split()))
numbers.sort()
# 같은게 하나라도 있으면 True, 없으면 False
def is_good_number(numberList:list, search_number:int, search_number_index:int):
left=0
right=len(numberList)-1
while(left!=right):
# left+right=sumNumber sumNumber 구한다.
sum_number = numberList[left]+numberList[right]
# sumNumber 찾는 수랑 같으면서 left,right가 search_number_index랑 다르면 True 반환
if sum_number==search_number:
if left != search_number_index and right != search_number_index:
return True
if left == search_number_index:
left+=1
elif right == search_number_index:
right-=1
# sumNumber가 찾는 수보다 크면 -> 줄인다. -> right-=1
elif sum_number > search_number:
right-=1
# sumNumber가 찾는 수보다 작으면 -> 크게한다. -> left+=1
elif sum_number < search_number:
left+=1
return False
for i in range(0,len(numbers)):
# 찾을 숫자를 저장하고
search_number = numbers[i]
# 좋은 숫자인지 판단하기
if is_good_number(numbers,search_number,i):
good_count+=1
print(good_count)