1. 문제

2559번: 수열



2. 개요

매일 오전 9시에 측정한 온도의 수열이 주어졌을 때,

연속적인 K일간의 온도의 합이 가장 큰 경우의 온도의 합을 구하는 문제.



3. 풀이 및 코드

3-1. 풀이

먼저 주어진 수열에 대한 누적합 배열 sums를 만든다.

어떤 수 i일 까지의 연속적인 K일간의 온도의 합은 sums[i] - sums[i - K]로 나타낼 수 있다.

따라서 가능한 i에 대하여 해당 값을 answer와 비교하며 더 큰 값을 계속 갱신한 뒤, 답을 출력한다.

3-2. Python

import sys

N, K = map(int, sys.stdin.readline().split())

nums = list(map(int, sys.stdin.readline().split()))
sums = [0]

for i in range(N):
    sums.append(nums[i] + sums[-1])

answer = -100000000

for i in range(K, N+1):
    answer = max(answer, sums[i] - sums[i - K])

print(answer)

3-3. C#

namespace boj_2559
{
    internal class Program
    {
        static void Main(string[] args)
        {
            StreamReader sr = new StreamReader(Console.OpenStandardInput());
            StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

            string[] input = sr.ReadLine().Split();

            int N = int.Parse(input[0]), K = int.Parse(input[1]);

            int[] nums = Array.ConvertAll(sr.ReadLine().Split(), int.Parse);
            int[] sums = new int[N + 1];

            for (int i = 0; i < N; i++)
                sums[i + 1] = sums[i] + nums[i];

            int answer = -100000001;

            for (int i = K; i < N + 1; i++)
                answer = (int)MathF.Max(answer, sums[i] - sums[i - K]);

            sw.WriteLine(answer);
            sw.Close();
        }
    }
}

Comments