99클럽 코테 스터디 5일차 TIL + 수열(백준 2559번)

2025. 4. 4. 20:08·항해99 코테

✅ 오늘의 학습 키워드

- 누적합 (Prefix Sum)


✅ 공부한 내용

- 오늘은 연속된 K개 요소의 합이 최대가 되는 부분 배열을 찾는 문제를 누적합 기법으로 접근해 봤다.

누적합(Prefix Sum) 기법 이해하기

누적합은 배열의 각 위치까지의 합을 미리 계산해 두는 방식이다.
이렇게 하면 어떤 구간 [i, j]의 합도 O(1) 시간에 prefixSum[j+1] - prefixSum[i]로 계산할 수 있다.

// 누적합 배열 계산
vector<int> prefixSum(n+1, 0);
for(int i = 0; i < n; i++){
    prefixSum[i + 1] = prefixSum[i] + nums[i];
}

 

예를 들어, 배열 [3, -2, -4, -9, 0, 3, 7, 13, 8, -3]의 누적합은 [0, 3, 1, -3, -12, -12, -9, -2, 11, 19, 16]이 된다.

이를 활용하면 인덱스 7~8 위치(13, 8)의 합은 prefixSum[9] - prefixSum[7] = 19 - (-2) = 21로 빠르게 계산할 수 있다.


✅ 오늘의 회고


  - 어떤 문제가 있었고, 나는 어떤 시도를 했는지

오늘 풀었던 문제는 연속된 K개 요소의 최대 합을 구하는 것이었다. 누적합을 이용해 문제를 해결하는 방법을 시도했고, 이 과정에서 누적합 배열의 크기와 인덱싱에 주의해야 한다는 점을 깨달았다.

  - 어떻게 해결했는지

누적합 배열을 n+1 크기로 만들어서 prefixSum[0]은 0으로, prefixSum[i]는 원래 배열의 0번부터 i-1번까지의 누적합을 저장하도록 구현했다. 그런 다음 모든 가능한 K 길이 구간에 대해 prefixSum[i] - prefixSum[i-k] 값을 계산하여 최대값을 찾았다.

 

// 누적합 이용
int findMaxSum(vector<int>& nums, int k){
    int n = nums.size();
    vector<int> prefixSum(n+1, 0);

    for(int i = 0; i < n; i++){
        prefixSum[i + 1] = prefixSum[i] + nums[i];
    }

    int maxSum = prefixSum[k] - prefixSum[0];
    for (int i = k + 1; i <= n; i++) {
        maxSum = max(maxSum, prefixSum[i] - prefixSum[i - k]);
    }

    return maxSum;
}

 

처음에 maxSum 변수를 잘못 초기화하는 실수가 있었지만, 첫 번째 K개 요소의 합으로 초기화하는 방식으로 수정했다.

  - 무엇을 새롭게 알았는지

이 문제는 슬라이딩 윈도우나 투 포인터 방식으로도 해결할 수 있다는 점을 알게 되었다.

아래는 슬라이딩 윈도우 코드다. 뭔가 유사한듯 ..아닌듯..🤔

메모리 효율성은 슬라이딩 윈도우가 더 적합하다고 한다. 다음에는 슬라이딩 윈도우를 써봐야지~

// 슬라이딩 윈도우 사용
int findMaxSum_SlidingWindow(vector<int>& nums, int k){
    int n = nums.size();
    int windowSum = 0;
    
    // 첫 k개 요소의 합 계산
    for(int i = 0; i < k; i++){
        windowSum += nums[i];
    }
    
    int maxSum = windowSum;
    
    // 윈도우를 한 칸씩 오른쪽으로 이동
    for(int i = k; i < n; i++){
        windowSum = windowSum + nums[i] - nums[i - k];
        maxSum = max(maxSum, windowSum);
    }
    
    return maxSum;
}

 


🛠️ 전체 코드 (누적 합)

#include <iostream>
#include <vector>

using namespace std;

int findMaxSum(vector<int>& nums, int k){ 
    int n = nums.size();
    vector<int> prefixSum(n+1, 0);

    for(int i = 0; i < n; i++){
        prefixSum[i + 1] = prefixSum[i] + nums[i];
    }

    int maxSum = prefixSum[k] - prefixSum[0];;
    for (int i = k + 1; i <= n; i++) {
        maxSum = max(maxSum, prefixSum[i] - prefixSum[i - k]);
    }

    return maxSum;
}

int main()
{   
    int n; 
    int k;

    cin >> n >> k;

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

    int result = findMaxSum(nums, k);
    cout << result << '\n';

    return 0;
}

'항해99 코테' 카테고리의 다른 글

99클럽 코테 스터디 7일차 TIL + 쇠막대기(백준 10799번)  (0) 2025.04.08
99클럽 코테 스터디 6일차 TIL + 섬의개수(백준 4963번)  (0) 2025.04.07
99클럽 코테 스터디 3일차 TIL + 바탕화면 정리  (0) 2025.04.02
99클럽 코테 스터디 2일차 TIL + 피보나치 비스무리한 수열  (0) 2025.04.01
99클럽 코테 스터디 1일차 TIL + 소수 구하기  (0) 2025.03.31
'항해99 코테' 카테고리의 다른 글
  • 99클럽 코테 스터디 7일차 TIL + 쇠막대기(백준 10799번)
  • 99클럽 코테 스터디 6일차 TIL + 섬의개수(백준 4963번)
  • 99클럽 코테 스터디 3일차 TIL + 바탕화면 정리
  • 99클럽 코테 스터디 2일차 TIL + 피보나치 비스무리한 수열
탱도시락
탱도시락
  • 탱도시락
    코딩도시락
    탱도시락
  • 전체
    오늘
    어제
    • 분류 전체보기 (25)
      • CS50 (4)
      • 항해99 코테 (17)
      • C++ 코딩테스트 준비 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    James Cameron
    컴퓨터과학
    코딩테스트 합격자 되기
    창작과모방
    아스키코드
    부스트코스
    유니코드
    코칭스터디 2기
    배열의 효율성
    개발자취업
    디지털윤리
    데이터 타입
    C++
    2차원 배열
    2진수
    항해99
    시간복잡도
    알고리즘 효율 분석
    인간도 모델이다
    Vector
    2진법
    Til
    코딩테스트 문법
    99클럽
    코딩테스트준비
    코테
    컴퓨팅 사고력
    코딩테스트
    CS50 코칭스터디 2기
    CS50
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
탱도시락
99클럽 코테 스터디 5일차 TIL + 수열(백준 2559번)
상단으로

티스토리툴바