백준 1253 파이썬

손찬호·2024년 4월 16일
0

알고리즘

목록 보기
19/91

N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.
N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.
수의 위치가 다르면 값이 같아도 다른 수이다.

입력

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

출력

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

풀이 아이디어

맨 처음과 맨 끝 포인터 left, right를 설정하고
각 포인터가 가리키는 숫자값을 합한 sum_number를 구하고
찾는 숫자가 search_number일 때

1) sum_number == search_number

같으면서 left,right 각각이 search_number의 인덱스를 가리키지 않으면
좋은 숫자이므로 True를 반환한다.

2) sum_number > search_number

sum_number를 작게해야한다 -> right-=1

3) sum_number < search_number

sum_number를 크게 해야한다 -> left+=1

4) 종료 조건: left==right

테스트 케이스

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)

profile
매일 1%씩 성장하려는 주니어 개발자입니다.

0개의 댓글

관련 채용 정보