내가 맨처음 푼 답(오답)
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")
투포인터를 이용하지 않고 풀어도 되는 문제 같아 투포인터 부분을 없애고 해결해 보았다.
코드가 더 짧고 더 빠른 시간으로 해결된다.