▶ 출처 : https://www.youtube.com/watch?v=rI8NRQsAS_s
문제1) 배열의 특정 연속된 구간을 처리하는 경우 ( 시간제한: O(n) )
ex) [1,2,3,2,5]중에서 합이 5인 '연속 수열의 개수'를 구하는 문제
▶ 투 포인터를 활용한 알고리즘 코드
# 데이터 개수:n, 부분연속수열의 합: m
n = 5
m = 5
data = [1,2,3,2,5]
start = 0
end = 0
result = 0
sum_val = data[0]
end_flag=0 # end는 범위를 넘어버릴 가능성이 있으므로 while조건 체크후, flag체크후 sum_val 늘려주기
while start < n and end < n:
if end_flag == 1:
sum_val += data[end]
end_flag=0
print(start, end, sum_val)
if sum_val < m:
end += 1
end_flag = 1
elif sum_val > m:
sum_val -= data[start]
start += 1
start_flag = 1
elif sum_val == m:
print('>>find!')
result += 1
end += 1
end_flag = 1
print(result)
'''
n, m = 5, 5 # 데이터 개수:n, 부분연속수열의 합: m
data = [1,2,3,2,5]
result = 0
sum_val = 0
end = 0
for start in range(n):
# end를 가능한 만큼 이동시키기
while sum_val < m and end < n:
sum_val += data[end]
end += 1
# 부분합이 정확히 m일때 카운트 증가
if sum_val == m:
result += 1
print('현재 인덱스: start, end=', start, end)
# 다음 start넘어가기 전에 data[start]를 sum_val에서 빼주기
sum_val -= data[start]
print(result)
'''
문제2) 구간 합 빠르게 계산하기 ( 시간제한: O(n+m) )
ex) [10,20,30,40,50]에서 Left와 Right정보가 들어왔을때 구간합 계산하기
▶ Prefix Sum을 활용한 알고리즘 코드
n = 5 # 데이터 개수:n
data = [10,20,30,40,50]
# Prefix Sum 배열 계산후 저장
sum_val = 0
prefix_sum = [0]
for a in data:
sum_val += a
prefix_sum.append(sum_val)
# left = 2, right=4 일때 구간 합 계산 ?
left = 2
right = 4
print(prefix_sum[right] - prefix_sum[left-1])
'코테 핵심노트 > 노트' 카테고리의 다른 글
노트 #6: 파이썬 2차원 배열 선언(초기화) (0) | 2020.05.22 |
---|---|
노트 #5 : 파이썬 join() (0) | 2020.05.18 |
노트#4 : 파이썬 리스트 조합 구하기 (0) | 2020.05.13 |
노트#3 : 정규표현식 (0) | 2020.05.13 |
노트#2 : 파이썬 리스트의 값들을 전부 int로 바꾸기 (0) | 2020.05.13 |