PS & Algorithm/알고리즘 코딩테스트 Python

[PS - Do It!] 3-3. 자료구조 : 투 포인터(3)

Jae. 2023. 6. 30. 20:23
728x90

https://www.acmicpc.net/problem/1253

 

[G4] 좋다

 

문제

N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.

N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.

수의 위치가 다르면 값이 같아도 다른 수이다.

입력

첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)

출력

좋은 수의 개수를 첫 번째 줄에 출력한다.

예제 입력 1 

10
1 2 3 4 5 6 7 8 9 10

예제 출력 1 

8

힌트

3,4,5,6,7,8,9,10은 좋다.

 

  • 기존의 투 포인터 유형 중 양끝에서 포인터들이 시작하는 유형
  • 예외처리 : 정렬된 데이터에서 자기 자신을 좋은 수 만들기에 포함하면 안 됨
  • 즉, 정렬된 배열에서의 인덱스 i가 start 혹은 end와 동일하면 안된다!
import sys
input = sys.stdin.readline

# 수의 개수 n
n = int(input())

# 총 n개의 수
array = sorted(list(map(int, input().split())))

cnt = 0

for i in range(n) : 
    num = array[i]
    
    # start, end index 설정
    start, end = 0, n-1
    
    while start < end :
        sums = array[start] + array[end]
        
        if sums > num :
            end -=1
        elif sums < num :
            start +=1
        # 예외처리 : 정렬된 데이터에서 자기자신을 좋은 수 만들기에 포함하면 안 됨
        else :
            if i != start and i != end :
                cnt +=1
                break
            elif i == start :
                start +=1
            elif i == end :
                end -=1
        
print(cnt)
728x90