Skip to content

Conversation

@flydongwoo
Copy link
Collaborator

πŸ”— 문제 링크

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

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

10λΆ„

✨ μˆ˜λ„ μ½”λ“œ

μ‰½μ§€λ§Œ μ†Œμ†Œν•œ 감동을 μ•ˆκ²¨μ£ΌλŠ” 문제 κ°€μ Έμ™”μŠ΅λ‹ˆλ‹€!
문제λ₯Ό 직접 풀어보셨닀면, μ œκ°€ 이 문제λ₯Ό μ„ νƒν•œ 이유λ₯Ό μ•Œκ²Œ λ˜μ‹€ 것이라 λ―ΏμŠ΅λ‹ˆλ‹€.

크게 λ³΅μž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
처음 K개의 합을 ꡬ해 window_sum에 μ €μž₯ν•œ ν›„
i=K λΆ€ν„° N-1κΉŒμ§€ ν•œ μΉΈμ”© "μ°½λ¬Έ"을 였λ₯Έμͺ½μœΌλ‘œ λ°€λ©°,
μ™Όμͺ½μœΌλ‘œ λΉ μ§€λŠ” 값을 λΉΌκ³ ,
μƒˆλ‘œ λ“€μ–΄μ˜€λŠ” 값을 λ”ν•΄μ„œ
맀번 max_sum을 κ°±μ‹ ν•˜λ©΄ λ©λ‹ˆλ‹€!

μ‹œκ°„λ³΅μž‘λ„λŠ” O(N)μ—μ„œ λλ‚˜λŠ” μ•„μ£Ό κ°„λ‹¨ν•œ λ¬Έμ œμž…λ‹ˆλ‹€.

μ €λŠ” μ•ˆμ „ν•˜κ²Œ long long을 μ‚¬μš©ν–ˆλ„€μš”

제 μ½”λ“œλ₯Ό λ³΄μ‹œμ£ 

#include <iostream>   
#include <vector>     
#include <algorithm>  

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, K;
    cin >> N >> K;
    vector<int> a(N);

    for (int i = 0; i < N; i++) {
        cin >> a[i];
    }

    long long window_sum = 0;

    for (int i = 0; i < K; i++) {
        window_sum += a[i];
    }

    long long max_sum = window_sum;

    for (int i = K; i < N; i++) {
        window_sum += a[i];
        window_sum -= a[i - K];
        max_sum = max(max_sum, window_sum);
    }

    cout << max_sum << endl;
    return 0;
}

Q1. μ œκ°€ max_sum을 0이 μ•„λ‹ˆλΌ window_sum으둜 μ΄ˆκΈ°ν™”ν•œ μ΄μœ λŠ” μ •ν™•νžˆ λ¬΄μ—‡μΌκΉŒμš”?
Q2. 값이 음수일 λ•Œ μ–΄λ–€ λ¬Έμ œκ°€ λ°œμƒν• κΉŒμš”?
Q3. λ§Œμ•½ K와 N이 κ°™μ•„μ§€λ©΄ μ„±λŠ₯에 λ³€ν™”κ°€ μžˆμ„κΉŒμš”?
Q4. 문제 쑰건 쀑 N β‰₯ KλΌλŠ” 보μž₯이 μ—†λ‹€λ©΄ μ–΄λ–»κ²Œ μˆ˜μ •ν•΄μ•Όν• κΉŒμš”?

prefix sumμœΌλ‘œλ„ 이 문제λ₯Ό ν’€ 수 μžˆλŠ” κ²ƒμœΌλ‘œ μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€!
λ„μ „ν•΄λ³΄μ‹œλŠ” 것 μΆ”μ²œλ“œλ¦΄κ²Œμš”!

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

μŠ¬λΌμ΄λ”© μœˆλ„μš° κ°€λ³κ²Œ λ¦¬λ§ˆμΈλ“œν•˜κ³  κ°€λŠ” μ£Όμ°¨μ˜€μŠ΅λ‹ˆλ‹€ :)

@hyeokbini
Copy link
Collaborator

μŠ¬λΌμ΄λ”© μœˆλ„μš°λ₯Ό μ‚¬μš©ν•˜λŠ” 법을 λ¦¬λ§ˆμΈλ“œν•˜λŠ” κ°„λ‹¨ν•œ λ¬Έμ œλ„€μš”. 일반적인 ν’€μ΄λ‘œλŠ” λ°˜λ³΅λ¬Έμ„ λŒλ©΄μ„œ λ‚΄λΆ€μ—μ„œ kλ§ŒνΌμ„ 또 λ‹€μ‹œ λ°˜λ³΅ν•˜λ©° 돌고, 합을 κ΅¬ν•˜λ©΄μ„œ max값을 κ°±μ‹ ν•˜λŠ” 아이디어λ₯Ό λ– μ˜¬λ¦΄ 수 μžˆμ§€λ§Œ, κ·Έλ ‡κ²Œ λœλ‹€λ©΄ μ΅œμ•…μ˜ μ‹œκ°„ λ³΅μž‘λ„μ—μ„œλŠ” O(N^2)κ°€ λ˜λ―€λ‘œ μ‹œκ°„μ΄ˆκ³Όλ₯Ό 먹을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ 0번 μΈλ±μŠ€λΆ€ν„° K - 1번 μΈλ±μŠ€κΉŒμ§€μ˜ λ°°μ—΄ 합을 ꡬ해둔 λ’€, 맨 μ•ž 뢀뢄을 λΉΌκ³  맨 λ’· λΆ€λΆ„ μƒˆλ‘œμš΄ 인덱슀 값을 μΆ”κ°€ν•˜λŠ” μ‹μœΌλ‘œ 값을 κ°±μ‹ ν•΄κ°€λŠ” μ‹œκ°„λ³΅μž‘λ„κ°€ O(N)인 풀이λ₯Ό λ– μ˜¬λ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

MAX_SUM은 초기 값을 λ‹΄κ³  μžˆμ–΄μ•Ό ν•˜λŠ”λ°, 이 배열은 μŒμˆ˜κ°€ λ‹΄κΈΈ 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 0이 μ•„λ‹ˆλΌ μ‹€μž¬ν•˜λŠ” 값듀을 κ³„μ‚°ν•΄μ„œ λ‹΄μ•„ 두어야 ν•˜λ―€λ‘œ λ°°μ—΄ μ•ž λΆ€λΆ„ K개λ₯Ό ν•©ν•΄μ„œ μ΄ˆκΈ°ν™”ν•΄ 두어야 ν•©λ‹ˆλ‹€.

μ•„λž˜λŠ” 제좜 μ½”λ“œμž…λ‹ˆλ‹€. λ¦¬λ§ˆμΈλ“œν•˜κΈ° 쒋은 λ¬Έμ œμ˜€μ–΄μš”. κ³ μƒν•˜μ…¨μŠ΅λ‹ˆλ‹€!

μˆ˜μ—΄/c++
#include <bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    //freopen("test.txt", "rt", stdin);
    int n, m;
    cin >> n >> m;
    vector<int> arr(n);
    for(int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
        
    int sum = 0;
    for(int i = 0; i < m; i++)
    {
        sum += arr[i];
    }
        
    int ans = sum;

    for(int i = m; i < n; i++)
    {
        sum = sum - arr[i - m] + arr[i];
        ans = max(ans, sum);
    }

    cout << ans;
    return 0;
}

Copy link
Collaborator

@Seol-Munhyeok Seol-Munhyeok left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1년전에 C++둜 ν’€μ—ˆλ˜ 문제라 κ°„λ‹¨ν•˜κ²Œ λ¦¬λ§ˆμΈλ“œλ§Œ ν•˜κ³  κ°‘λ‹ˆλ‹€.
μ΄λ•ŒλŠ” μŠ¬λΌμ΄λ”© μœˆλ„μš°λŠ” 생각λͺ»ν–ˆκ³  λˆ„μ ν•©(prefix sum) κΈ°λ²•μœΌλ‘œ 문제λ₯Ό ν’€μ—ˆλ„€μš”.
λˆ„μ ν•©μœΌλ‘œ ν’€λ©΄ ꡬ간 쿼리(iλ²ˆμ§ΈλΆ€ν„° j번째 κΉŒμ§€ λ”ν•˜λ©΄ μ–Όλ§ˆ?)λ₯Ό μ‰½κ²Œν•  수 μžˆλ‹€λŠ” μž₯점이 μžˆμ–΄μ„œ λ­”κ°€ ꡬ간 쿼리에 λŒ€ν•œ 문제라면 λˆ„μ ν•©μ„ λ¨Όμ € λ– μ˜¬λ¦¬λŠ” κ±° κ°™μŠ΅λ‹ˆλ‹€.
13주차에 ν’€μ—ˆλ˜ λ¬Έμ œλ„ λˆ„μ ν•©μ„ μ΄μš©ν•˜λŠ” λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” 풀이 μ½”λ“œμž…λ‹ˆλ‹€.

#include <bits/stdc++.h>
using namespace std;
int n, k, tmp, psum[100001], ret = -1e9;
int main(){
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin >> n >> k;
    for (int i = 1; i <= n; i++){
        cin >> tmp; psum[i] = psum[i - 1] + tmp;
    }
    for (int i = k; i <= n; i++){
        ret = max(ret, psum[i] - psum[i - k]);
    }
    cout << ret << '\n';
    return 0;
}

μ§ˆλ¬Έμ— λŒ€ν•΄ 닡을 ν•˜μžλ©΄...
Q1. 값에 μŒμˆ˜κ°€ λ“€μ–΄κ°ˆ 수 있기 λ•Œλ¬Έμ— λͺ¨λ“  값이 음수인 μΌ€μ΄μŠ€λΌλ©΄ 0보닀 μž‘μ€ 값이 μ΅œμ†Ÿκ°’μ΄ 될 수 μžˆμ–΄μ„œ λ¬Έμ œκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€! κ·Έλž˜μ„œ μ΄ˆκΈ°κ°’μ„ μ‹€μ œλ‘œ μžˆλŠ” κ°’ 쀑 ν•˜λ‚˜λ‘œ μ„€μ •ν•˜κ±°λ‚˜ μ•„λ‹ˆλ©΄ 제 ν’€μ΄μ²˜λŸΌ 음수인 μ—„μ²­ μž‘μ€ 수둜 μ΄ˆκΈ°ν™”ν•΄μ•Όν•©λ‹ˆλ‹€.
Q2. μœ„ ν’€μ΄λŠ” μ΄ˆκΈ°κ°’μ„ 잘 μ„€μ •ν•΄μ£Όκ³  있기 λ•Œλ¬Έμ— 값이 μŒμˆ˜μ—¬λ„ μ•„λ¬΄λŸ° 상관이 μ—†μŠ΅λ‹ˆλ‹€.
Q3. K == N 이라도 μ‹œκ°„λ³΅μž‘λ„ κ΄€μ μ—μ„œλŠ” λͺ¨λ‘ $O(N)$으둜 κ°™μŠ΅λ‹ˆλ‹€. 루프λ₯Ό λ„λŠ” νšŸμˆ˜λŠ” 쀄긴 ν•˜κ² λ„€μš”.
Q4. N β‰₯ KλΌλŠ” 보μž₯이 μ—†μœΌλ©΄ κ·Έλƒ₯ μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ€˜μ•Όν•  κ±° κ°™μ€λ°μš”? λ¬Έμ œκ°€ μ„±λ¦½ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!

@mj010504
Copy link
Collaborator

저도 맨 처음 k번째 만큼 λ”ν•œ κ°’ sum λ³€μˆ˜μ— λŒ€μž…ν•˜κ³ , ν•˜λ‚˜μ”©λΉΌκ³  ν•˜λ‚˜μ”© λ”ν•΄κ°€λŠ” ꡬ쑰둜 ν’€μ—ˆμŠ΅λ‹ˆλ‹€.
λ˜ν•œ res λ³€μˆ˜μ— μ΄ˆκΈ°κ°’μœΌλ‘œ 처음 sum 값을 ν• λ‹Ήν•΄μ€¬μŠ΅λ‹ˆλ‹€.
μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!

#include <bits/stdc++.h>

using namespace std;

int main() {
    freopen("input.txt", "rt", stdin);  
    ios::sync_with_stdio(false);  
    cin.tie(0);
    cout.tie(0);

    int n, k; cin >> n >> k;
    vector<int> v(n);
    for(int i = 0; i < n; i++) {
        cin >> v[i];
    }

  
    int sum = 0;
    for(int i = 0; i < k; i++) sum += v[i];

    int res = sum;

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

    cout << res;

    return 0;
}

@flydongwoo flydongwoo merged commit 85b622e into main Aug 20, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants