시간 초과

"""
# 계수 정렬 idea
중복된 수의 배열에서
topping : 토핑 종류( 번호)
return 공평하게 자르는 방법 수 (0 가능)
=> 숫자 종류가 같은 경우
0 graph : a,b => idx : 1~ 10,0000 번호
=> value 개수
for문으로 point 위치(왼쪽, idx 1~len(topping)-1-> 원소1 "p0 원소2")
1차 -> 시간 오류
= > slice 횟수 줄여보기
t = 5 -> 3 이상 , t=3 -> 2개 이상 , t= 2 -> 1개 이상, t= 1 ->상관 ㄴㄴ
t= 4 -> 2이상 , t= 6 , 3 이상
=> 올림
"""
import math
def solution(topping):
answer = 0 # 공평하게 자를 수 있는 경우의 수
# 0, graph
bro, sister = set(),set() # 중복 제거
#slice 횟수 조정 ->n개 종류(max(topping))중 최소 n/2
min_type = round(max(topping)/2)
for p in range(min_type, len(topping)) :
bro.update(topping[:p])
sister.update(topping[p:])
# 고유 원소 개수 비교
if len(bro) == len(sister) :
answer+=1
bro.clear(), sister.clear()
return answer
"""
# 계수 정렬 idea 적용
"""
def solution(topping):
answer = 0 # 공평하게 자를 수 있는 경우의 수
# 0, graph
forward = set()
backward = dict()
# 1. key 종류, value: toppping 중복 개수
for t in topping:
backward[str(t)]= backward.get(str(t),0)
backward[str(t)] += 1
print(backward)
#2. forward vs backward
for t in topping :
# f 에서 t가 추가됨 == b에서 t 빠짐
forward.add(t)
backward[str(t)] -=1
if backward[str(t)] == 0 :
del backward[str(t)]
# 토핑 종류 같은 경우 = 공평 한 경우
if len(forward) == len(backward.keys()):
answer+=1
return answer
