처음 코드
import math
def solution(q1, q2):
nums=q1+q2
N=len(nums)
if not sum(nums)%2==0:
return -1
target=sum(nums)//2
prefix=[0]*N
for i in range(N):
prefix[i]=prefix[i-1]+nums[i]
start=0
end=len(q1)
answer=math.inf
while start<=end and 0<=start<N and 0<=end<N:
cur_sum=0
if start==0:
cur_sum=prefix[end]
else:
cur_sum=prefix[end]-prefix[start-1]
if cur_sum>target:
start+=1
elif cur_sum<target:
end+=1
else:
# UPDATE
cost=start+end-len(q1)+1
answer=min(answer,cost)
start+=1
if answer==math.inf:
return -1
return answer
채점 결과
정확성: 90.0
합계: 90.0 / 100.0
?? 왜지?? 시간 복잡도도 O(N)일텐데…
아!!!!
start=0
end=len(q1)-1 # 여기서 -1을 안써서 틀렸었다
접근 방법
queue 자료구조 : “FIFO” → 큐 2개를 서로 pop, push하는 연산을 해도 FIFO 성질이 있으므로 “수의 순서”가 유지된다.
그렇다면 주어진 문제를 queue 1에 대한 구간합 문제로 바꾸어 풀 수 있다.
queue 1 “한쪽만 신경” 쓰면 queue 2는 자동으로 결정되기때문.
또한, 구간합에서 prefix를 이용하여 O(N)에 구간합을 구할 수 있도록하였다.