https://www.acmicpc.net/problem/2559

#include <iostream>
#include <vector>

using namespace std;

int n, k;
vector<int> v;
int Max = -200000;
int main()
{
    cin >> n >> k;
    v.resize(n, 0);
    for (int i = 0; i < n; i++)
        cin >> v[i];

    for (int i = 0; i <= n - k; i++)
    {
        int temp{};
        for (int j = i; j < k+i; j++)
        {
            temp += v[j];
        }
        Max = max(Max, temp);
    }

    cout << Max << endl;
}
  • 연속된 날짜에 온도를 더해 가장 큰 온도를 구하는 문제
  • vector에 온도를 저장하고 연속된 날짜의 온도를 더해줘야한다
  • 연속된 날짜의 온도 합을 구하기 위해 for문을 통해 반복할 것인데 규칙을 생각해보자
  • 연속된 날짜가 2이면 덧셈을 한 값의 갯수는 9개, 3이면 8개, 4개면 7개이다
  • 즉 날짜 n에 연속된 날짜 k를 빼준 값에 +1 해준 것 만큼 갯수가 나온다
  • 이걸 이용하면 n-k 와 같을 때 까지 반복을 하면 된다
  • 이때 이중 for문으로 j = i부터 연속된 날짜 k+1보다 작을 때 까지 반복해서 값을 더해준다
  • 두번째 for문이 끝나고 변수 Max 와 더한 결과 값을 비교해 더 큰 값을 Max에 저장해주면 된다

강의 문제 풀이


  • 구간합을 이용해 품
  • 최댓값을 구하라는 문제는 최솟값부터 최대 값을 구하면 된다
#include <iostream>
#include <vector>

using namespace std;

int n, k;
vector<int> v;
int Max = -200000;
int main()
{
    int temp{};
    cin >> n >> k;
    v.resize(n + 1, 0);
    for (int i = 1; i <= n; i++)
    {
        cin >> temp;
        v[i] = v[i - 1] + temp;
    }

    for (int i = k; i <= n; i++)
    {
        Max = max(Max, v[i] - v[i - k]);
    }

    cout << Max << endl;
}
  • temp에 입력되는 값들을 이용해 vector에 구간합으로 저장해 준다
  • for문을 k부터 n과 같을 때 까지 돌면서 큰 값을 찾아줄 것이다
  • 이때 현재 vector에 i번째 저장된 값과 i-k에 저장된 값을 뺀 값이 구간합으로 구한 값에 k개만 더한 값을 구할 수 있게 되는 것이다

image.png

  • 이게 무슨 소리냐 하면 사진을 보면 구간합을 1번 index부터 저장하여준뒤 두 번째 for문 연산을 하면 마지막 줄의 값이 나오게 되는 것이다
  • 이렇게 구하면 더 쉽고 간결하게 구할 수 있다

'코딩 태스트 > 문제풀이' 카테고리의 다른 글

패션왕 신해빈(x)  (0) 2025.01.10
나는야 포켓몬 마스터 이다솜(x)  (0) 2025.01.10
한국이 그리울 땐 서버에 접속하지(x)  (0) 2025.01.10
ROT13  (0) 2025.01.10
농구경기  (1) 2025.01.10