백준 온라인 저지, 이진탐색 / 1253번: 좋다 (파이썬 / 백준 골드문제)

2021. 11. 24. 23:01알고리즘/이진탐색

728x90
반응형

문제

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은 좋다.

접근 방법

- 주어진 숫자를 정렬한 뒤 이중 반복문을 통해 숫자를 하나씩 탐색하며 이진탐색을 통해 값을 구한다.

코드

# 접근 방법
# 주어진 숫자를 정렬한 뒤 이중 반복문을 통해 숫자를 하나씩 탐색하며 이진탐색을 통해 값을 구한다.
n = int(input())
array = list(map(int, input().split()))
array.sort()
count = 0
for i in range(n):
    x = array[i]
    for j in range(n):
        if i == j:
            continue
        start = 0
        end = n - 1
        check = False
        while start <= end:
            mid = (start+end)//2
            if x == array[j] + array[mid]:
                m = mid
                while i == m or j == m:
                    if m == 0:
                        break
                    m -= 1

                if (i != m and j != m) and (x == array[j] + array[m]):
                    count += 1
                    check = True
                    break
                
                m = mid
                while i == m or j == m:
                    if m == n - 1:
                        break
                    m += 1

                if (i != m and j != m) and (x == array[j] + array[m]):
                    count += 1
                    check = True
                    break
                break
                
            elif x > array[j] + array[mid]:
                start = mid + 1
            else:
                end = mid - 1
        if check:
            break
print(count)
728x90
반응형