[파이썬] 백준 3151 : 합이 0 (골드4)
풀이
방향성 생각
- 입력 크기가 10000이라, dict으로 val:개수 형태로 반환해서 계산하기
- $O(N)$으로 압축해주고, aaa, aab 에서 각 $O(N)$이라 $O(2N)$이다.
- abc로 0을 만드는 경우가 $O(N^2)$이라 브루트포스로 풀이
전체코드
from collections import defaultdict as dd
N = int(input())
arr = list(map(int,input().split()))
answer = [0,0,0]
cnts = dd(int)
for a in arr:
cnts[a] += 1
# a a a
if cnts[0] >= 3:
answer[0] += cnts[0]*(cnts[0]-1)*(cnts[0]-2)
# a a b
for a in cnts.keys():
if a and cnts[a]>=2 and -2*a in cnts:
answer[1] += (cnts[a]*(cnts[a]-1))*cnts[-2*a]
# a b c
for a in cnts.keys():
for b in cnts.keys():
c = -(a+b)
if c in cnts and a!=b and a!=c and b!=c:
answer[2] += cnts[a]*cnts[b]*cnts[c]
print(answer[0]//6 + answer[1]//2 + answer[2]//6)
코멘트
- 압축 효과가 별로 없는 케이스도 많고, dict을 사용해서 python3는 터졌고 pypy3로 풀이.
'Algorithm > etc' 카테고리의 다른 글
[파이썬] 백준 5800 : 성적 통계 (실버5) (0) | 2025.01.20 |
---|---|
[파이썬] 백준 1644 : 소수의 연속합 (골드3) (0) | 2024.11.16 |
[파이썬] 백준 2230 : 수 고르기(골드5) (0) | 2024.10.02 |
[파이썬] 백준 2473 : 세 용액 (골드3) (0) | 2024.08.04 |
[파이썬] 백준 1806 : 부분합 (골드4) (0) | 2024.08.02 |
[파이썬] 백준 11660 : 구간 합 구하기 5 (실버1) (0) | 2024.08.02 |
[파이썬] 백준 30804 : 과일탕후루 (실버2) (0) | 2024.06.11 |
댓글