백준 문제/문자열,누적합,구현
[백 준/구현] 2559: 수열
goldpig
2024. 1. 1. 14:55
728x90
https://www.acmicpc.net/problem/2559
2559번: 수열
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기
www.acmicpc.net
핵심 아이디어
- 구간 합 구하기
풀이
import sys
input = sys.stdin.readline
result =[]
n, k = map(int,input().split())
a = list(map(int, input().split()))
for i in range(n - k + 1):
result.append(sum(a[i:i+k]))
print(max(result))
sum 연산을 반복해서 계산을 하다 보니 시간 초과 문제가 생겼다. 그래서 sum을 한번만 연산하는 방식으로 풀이를 진행하였다. 처음에는 이 문제가 간단해 보였지만 고민을 해도 어떻게 풀어야할 지 떠오르지 않아 애를 많이 먹었던 문제다.
import sys
input = sys.stdin.readline
n, k = map(int, input().split())
data = list(map(int, input().split()))
# 그 구간까지의 합을 저장하기 위한 빈 리스트
result = []
# 초기화
result.append(sum(data[:k]))
for i in range(n-k):
result.append(result[i] - data[i] + data[i+k])
print(max(result))
주어진 리스트에서 연속된 k개의 요소의 합이 최대가 되는 구간을 찾는 알고리즘입니다. 주요 로직은 다음과 같습니다.
알고리즘 구현
- result = []: 연속된 k개 요소의 합을 저장할 리스트를 초기화합니다.
- result.append(sum(data[:k])): 처음 k개 요소의 합을 result 리스트에 추가합니다.
- 이후 for 루프에서는 현재 구간의 첫 번째 요소를 빼고, 다음 요소를 더하여 새로운 구간의 합을 구하는 방식입니다.
- for i in range(n-k): n-k번 반복합니다.
- result.append(result[i] - data[i] + data[i+k]): 현재 구간의 첫 번째 요소(data[i])를 빼고, 구간 끝의 다음 요소(data[i+k])를 더해 새로운 구간의 합을 계산하고 result에 추가합니다.
728x90