프로그래밍/Python

[백준] 1253번 - 좋다

뭉이씨 2025. 2. 11. 18:05

문제 링크 : https://www.acmicpc.net/problem/11003

 

문제

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

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

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

 

입력

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

 

출력

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

 

풀이

N = int(input())
nums = list(map(int,input().split()))

nums.sort()
count = 0

for n in range(N):
    k = nums[n]
    start = 0
    end = N-1
    while start < end:
        total = nums[start] + nums[end]
        if total == k:
            if start != n and end != n:
                count+=1
                break
            elif start == n:
                start+=1
            else:
                end-=1
        elif total < k:
            start+=1
        else:
            end-=1
print(count)

 

해설

  • 리스트를 정렬한 뒤 투포인터로 구간합을 구하는 문제였다.
  • 파이썬 문법이 가물가물해서 and를 &로 적었다가 오래 헤맨 문제 .. ㅎㅎ..
  • start나 end가 n인지를 total == k일 때 판별해줘야하는 이유는 입력이 '0 1' 이런식으로 처음부터 바로 total == k 인 값들로 들어올 수도 있기 때문이다.