📌 문제 설명
현수 아빠는 제과점을 운영 중이며, N일 동안의 매출 기록 중 연속된 K일간의 최대 매출액을 구하려 합니다.
예를 들어 N=10이고, 매출이 아래와 같을 때 K=3일 경우 가장 높은 3일간 매출은 11+20+25 = 56입니다.
12 15 11 20 25 10 20 19 13 15
📝 입력 & 출력
입력
- 첫 줄: 정수 N(5 ≤ N ≤ 100,000), K(2 ≤ K ≤ N)
- 두 번째 줄: N개의 매출 기록 (각 값은 0~500)
출력
- 첫 줄에 연속된 K일 동안의 최대 매출을 출력
🔸 예제 입력 & 출력
예제 입력 1
10 3
12 15 11 20 25 10 20 19 13 15
예제 출력 1
56
💡 해결 방법
- 슬라이딩 윈도우(Sliding Window) 기법을 사용합니다.
- 처음 K일의 합을 구한 뒤, 윈도우를 한 칸씩 오른쪽으로 이동시키며 이전 합에서 가장 왼쪽 값을 빼고, 새로운 값을 더하는 방식으로 최대값을 갱신합니다.
💻 코드 구현 (Java)
package partTwoPointers;
import java.util.*;
public class Problem3 {
public int solution(int n, int k, int[] arr){
int sum = 0;
for(int i = 0; i < k; i++) sum += arr[i];
int result = sum;
for(int i = k; i < n; i++) {
sum += arr[i] - arr[i - k];
result = Math.max(result, sum);
}
return result;
}
public static void main(String[] args) {
Problem3 T = new Problem3();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
int k = kb.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = kb.nextInt();
}
System.out.print(T.solution(n, k, arr));
kb.close();
}
}
📖 코드 설명
1️⃣ 초기 구간 합 계산
for(int i = 0; i < k; i++) sum += arr[i];
- 첫 번째 윈도우(K일간)의 총합을 먼저 계산
2️⃣ 슬라이딩 윈도우 적용
for(int i = k; i < n; i++) {
sum += arr[i] - arr[i - k];
result = Math.max(result, sum);
}
- sum에 새로 들어온 값을 더하고, 가장 왼쪽 값을 제거
- Math.max()로 최대값을 지속적으로 업데이트
⏳ 시간 복잡도 분석
- 초기 합 계산: O(K)
- 슬라이딩 과정: O(N - K)
- 전체 시간 복잡도: O(N)
출처: 인프런 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 | 김태원 - 인프런
김태원 | , 자바(Java) 알고리즘 문제풀이 채점사이트를 통해 기초부터 준비해보세요! 💪 [사진] 이 강의는 [사진] 자바(Java)로 코딩테스트 준비를 하고 계신 분께 추천드려요! 문제는 기초~ 중급
www.inflearn.com
'코딩테스트 > 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비' 카테고리의 다른 글
| 섹션 3 투 포인터 & 슬라이딩 윈도우 - 5. 연속된 자연수의 합(투 포인터) (0) | 2025.03.29 |
|---|---|
| 섹션 3 투 포인터 & 슬라이딩 윈도우 - 4. 연속 부분수열 (0) | 2025.03.29 |
| 섹션 3. 투 포인터 & 슬라이딩 윈도우 - 2. 공통원소 구하기 (0) | 2025.03.27 |
| 섹션 3. 투 포인터 & 슬라이딩 윈도우 - 1. 두 배열 합치기 (0) | 2025.03.27 |
| 섹션 2. Array - 12. 멘토링 (0) | 2025.03.27 |