Python/BAEKJOON
[백준] 21921번 블로그(python)
Magin
2023. 1. 2. 23:23
728x90
문제)
알고리즘)
- 시간복잡도를 생각하지 않고 문제를 본다면 대부분 for문과 sum 함수를 반복해서 사용해서 코드를 짜면 될 것 같지만
예시)
for i in range(N-X+1): #윈도우의 크기와 graph의 크기를 고려해서 움직일 수 있는 횟수만큼 반복
now = sum(graph[i:i+X]) #매번 sum함수로 해당 윈도우안에 해당하는 값 sum
이 경우 시간복잡도에서 걸리게 되어 시간초과가 됩니다.(for문과 sum 동시에 반복시 n^2의 시간복잡도 갖는다 최악!!)
- 핵심은 이름 그대로 Sliding Window처럼 지나가면서 윈도우에서 벗어나는 값은 빼고 새로 들어오는 값 더하기
start += graph[i] #들어오는 값 start -= graph[i-X]빠져나가는 값
코드)
#블로그
import sys
input = sys.stdin.readline
N, X = map(int, input().split()) #총일 윈도우 크기
graph = list(map(int, input().split())) #일별 방문자 수 리스트
if max(graph) == 0:# 전체가 0이여야 나오는 경우가 "SAD"
print("SAD")
else:
start = sum(graph[:X])#맨 처음 초기값만 sum함수 사용
total = start
cnt = 1 #최대합이 갯수는 0이 아닌 경우 모두 1
for i in range(X, N):
start += graph[i]
start -= graph[i-X]
if start > total:
total = start
cnt = 1
elif start == total:
cnt += 1
print(total)
print(cnt)
728x90