[백준] 2559: 수열 - 파이썬[python]

다인·2024년 11월 7일

백준

목록 보기
99/112
post-thumbnail

저번 구간합 문제처럼 수열의 합 공식을 이용해서 푸는 문제이다. 그런데 리스트가 2개고 이번엔 K라는 하나의 변수가 추가되면서 조심해야 할 부분이 많아졌다. 그래서 범위지옥에서 허우적거리다가 손으로 열심히 끄적여서 벗어날 수 있었다.

1. 코드

import sys
input = sys.stdin.readline

N, K = map(int, input().split())
temp = list(map(int, input().split()))
seq = [0] # temp의 0인덱스부터 n인덱스까지의 합을 n+1인덱스에 저장

for i in range(1, N+1):
    seq.append(seq[i-1]+temp[i-1]) # temp는 인덱스 0부터 저장됨

res = seq[K]

for i in range(K, N+1):
    tmp = seq[i]-seq[i-K]
    res = max(tmp, res)
print(res)
  • for문의 범위와 그에 따른 temp와 seq에서 접근할 인덱스, 또 그거에 맞춰서 seq는 0인덱스값부터 이용할지 해당 값은 그냥 더미값(0)을 넣어둘지.. 많은 것을 고려해서 작성한 코드이다.
  • 처음에 어 분명 맞는 코드인데 틀렸습니다가 떠서 왜인고... 엄청 고민했는데, res를 0으로 초기화했어서 그랬던 거였다. 합이 양수만 있는 게 아니라 음수도 나오기 때문에 초기의 0부터 K까지의 값(seq[K])으로 초기화해야 한다.

  • 그런데 이 코드를 보면 for문을 돌면서 열심히 더 한 걸 굳이 또 for문을 돌면서 뺀다.. 그래서 for문 1번에 K개의 값의 합을 seq에 바로 담을 수 있을 것 같아 코드를 다시 짜보았다. 그리고 구글링하니 다들 슬라이싱을 이용하더라. 슬라이싱까지 이용해서 다시 적어본 코드는 아래와 같다

2. 개선된 코드

import sys
input = sys.stdin.readline

N, K = map(int, input().split())
temp = list(map(int, input().split()))
seq = [sum(temp[:K])]

for i in range(K, N):
    seq.append(seq[i-K] - temp[i-K] + temp[i])

print(max(seq))
  • 이번엔 범위를 엄청 신경써서 적어주었는데 또 벗어난 범위에 접근.. 째려봤더니 for문의 마지막 범위를 N+1로 적었다. temp는 N-1까지 접근가능하기 때문에 N으로 적어줘야 한다.
  • 훨씬 간결하고 남들도 바로 이해할 수 있는 코드가 되었다.

근데 요새 백준허브 왜 이래? 이미 푼 문제는 다시 덮어씌워지지가 않아... 제발 자동으로 커밋 좀 해죠....

0개의 댓글