150. 합이 0
1) 어떤 전략(알고리즘)으로 해결?
2) 코딩 설명
<내 풀이>
https://velog.io/@myway00/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-224%EB%B2%88-%EB%B0%B1%EC%A4%80-%EB%B2%88
from collections import Counter
import sys
n = int(sys.stdin.readline().strip())
students = list(map(int,sys.stdin.readline().strip().split()))
students.sort()
std_counter = Counter(students)
res = 0
for i in range(n) :
s,e=i+1,n-1
target = -students[i]
while s<e :
cmp = students[s] + students[e]
if cmp < target :
s+=1
elif cmp == target :
if students[s]==students[e] :
res+= e-s
else :
res+= std_counter[students[e]]
s+=1
else :
e-=1
print(res)
<내 틀렸던 풀이, 문제점>
틀림 1
import sys
n=int(sys.stdin.readline())
lis=list(map(int,sys.stdin.readline().split()))
secondlis = lis.copy()
tot = 0
for i in range(n) :
pot1 = i
for j in range(i+1,n) :
pot2 = j
if(-(lis[pot1] + lis[pot2])) in lis[pot2+1:] :
tot+=lis[pot2+1:].count(-(lis[pot1] + lis[pot2]))
print(tot)
- 시간초과가 걸린다.
- 이는
if x in list
구문때문일 것이라고 추측
틀림2 - 이분탐색으로 접근
import sys
n=int(sys.stdin.readline())
lis=list(map(int,sys.stdin.readline().split()))
lis.sort()
tot = 0
for i in range(n-2) :
for j in range(n-1,i,-1) :
target =(-lis[i] + -lis[j])
lt = i
rt = j
while lt<=rt :
mid = (lt+rt)//2
if lis[mid]==target:
if mid==i:
break
if mid ==j:
break
tot+=1
for k in range(mid+1,rt):
if(lis[k]==target):
tot+=1
for k in range(lt+1,mid):
if(lis[k]==target):
tot+=1
break
elif lis[mid] < target:
lt = mid +1
elif lis[mid] > target :
rt = mid - 1
print(tot)
- 디버깅 중인데 어떤 테스트케이스가 틀린지 모르겠다..
<반성 점>
<배운 점>