[파이썬/python] 백준 21921번 : 블로그 (🥈3) (윈도우 슬라이딩)

내가 맨처음 푼 답(오답)

import sys
input = sys.stdin.readline

n, x = map(int, input().split())
arr = list(map(int, input().split()))
start, end = 0, x
max_num = sum(arr[start:end])
days = 1

while end < n:
  if max_num - arr[start] + arr[end] > max_num:
    max_num = max_num - arr[start] + arr[end]
    days = 1
    start += 1
    end += 1
  elif max_num - arr[start] + arr[end] == max_num:
    days += 1
    start += 1
    end += 1
  else:
    start += 1
    end += 1
   
if max_num == 0:
  print("SAD")
else:  
  print(max_num,days,sep="\n")

 

 

예제에 있는 테스트케이스는 통과하지만, 다른 엣지케이스를 확인하지 못한 것 같다.

 

while문 안의 if 전에

print(start,end,max_num,max_num - arr[start] + arr[end])

를 넣어서 확인해보니,

max_num - arr[start] + arr[end]

이 내가 의도한 값으로 나오지 않는 것을 발견했다.

예를 들어서

5 1

5 4 1 1 1 일 경우,

4

2

1

1

이 출력되어야 하는데,

4

2

5

5

가 출력되었다.

다시 생각해보니, 기간의 합이 최댓값이 아닌 경우에도 수를 계속 업데이트를 해줘서 이전까지의 최댓값과 비교했어야 했는데 이것을 생각하지 못했다.

 

 

 

import sys
input = sys.stdin.readline

n, x = map(int, input().split())
arr = list(map(int, input().split()))
start, end = 0, x
max_num = sum(arr[start:end])
num = sum(arr[start:end])
days = 1

while end < n:
  num = num - arr[start] + arr[end]
  if num > max_num:
    max_num = num
    days = 1
    start += 1
    end += 1
  elif num == max_num:
    days += 1
    start += 1
    end += 1
  else:
    start += 1
    end += 1
   
if max_num == 0:
  print("SAD")
else:  
  print(max_num,days,sep="\n")

 

기간의 합을 업데이트 해 줄 변수 num을 만들어 주었더니 해결되었다.

 

 

 

import sys
input = sys.stdin.readline

n, x = map(int, input().split())
arr = list(map(int, input().split()))

if sum(arr) == 0:
  print("SAD")
else:
  max_num = sum(arr[:x])
  num = sum(arr[:x])
  days = 1
  for i in range(x,n):
    num -= arr[i-x]
    num += arr[i]
    if max_num < num:
      max_num = num
      days = 1
    elif max_num == num:
      days += 1
  print(max_num,days,sep="\n")

 

투포인터를 이용하지 않고 풀어도 되는 문제 같아 투포인터 부분을 없애고 해결해 보았다.

코드가 더 짧고 더 빠른 시간으로 해결된다.

comment