본문 바로가기

# Coding/# 백준

[백준 / 1253] 좋다 - Python

728x90
반응형

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

 

 

1253번: 좋다

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

www.acmicpc.net

[풀이]

한 수를 다른 두 수의 합으로 나타내야 한다.

0 2가 있을 때 0+2는 2지만 다른 두 수가 아니므로 해당 경우는 카운트 하지 않고,

0 2 2 가 있을 때는 0+2[idx = 1]와 0+2[idx = 2]이므로 2개가 카운트 된다.

 

[전체 코드]

n = int(input())

numList = list(map(int, input().split()))
numList.sort()


# 중복 수 체크
# 수 개수 -1개
dup = {}
prev = 'a'
cnt = 0

for i in range(n):
    now = numList[i]
    if prev != now:
        dup[prev] = cnt
        prev = now
        cnt = 0
    else:
        cnt += 1        
dup[prev] = cnt


numSumList = []

for i in range(n-1):
    for j in range(i+1, n):
        n1 = numList[i]
        n2 = numList[j]
        # 한 수가 0인 경우 모든 수를 만들 수 있지만
        # 다른 수를 만들어야 하므로 
        if n1 == 0 and n2 == 0:
            if dup[0] > 1:
                numSumList.append(0)
        elif n1 == 0:
            if n2 in dup and dup[n2] > 0:
                numSumList.append(n2)
        elif n2 == 0:
            if n1 in dup and dup[n1] > 0:
                numSumList.append(n1)
        else:
            numSumList.append(n1+n2)
            
ans = set(numList) & set(numSumList)
good = len(ans)

for i in dup:
    if i in ans:
        good += dup[i]

print(good)
728x90
반응형