개발놀이터
3-3. 최대 매출 본문
package 배열응용3장.최대매출3다시3.my;
import java.util.Scanner;
public class Main {
/**
* -피드백-
* sliding window 알고리즘을 이용하여 풀면 된다.
* sliding window 는 two pointers algorithm 을 이용한 문제지만 딱히 two pointers algorithm 을 이용하지 않아도 된다.
* 선생님의 풀이처럼 for 문 하나를 가지고 풀어도 된다.
*
* -선생님 풀이-
* ex) 10개의 값을 3개만큼 합해서 최댓값을 구해야 한다면
* 1 2 3 4 5 6 7 8 9 10
* | |
* | |
* | |
* 이렇게 칸을 이동시키면 된다. 즉, 앞에건 빼주고 뒤에건 더해주면 된다.
* for (int i = k; i < n; i++) { // 여기서 k 는 구간개수 위의 예제에선 3
* sum += arr[i];
* sum -= arr[i - k];
* answer = Math.max(answer, sum); // 물론 answer 는 sum 으로 초기화 해줘야 한다.
* }
*/
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
int count = kb.nextInt();
int selection = kb.nextInt();
int[] arr = new int[count + 1];
for (int i = 0; i < count; i++) {
arr[i] = kb.nextInt();
}
System.out.println(solution(arr, count, selection));
}
private static int solution(int[] arr, int count, int selection) {
int start = 0, end = selection - 1;
int max = Integer.MIN_VALUE;
int sum = 0;
for (int i = 0; i <= end; i++) {
sum += arr[i];
}
while (start < count && end < count) {
if (end + 1 == count) {
break;
}
if (max < sum) {
max = sum;
}
sum += arr[end + 1];
sum -= arr[start];
start++;
end++;
}
return max;
}
}
package 배열응용3장.최대매출3다시3.teacher;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
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.println(solution(n, k, arr));
}
private static int solution(int n, int k, int[] arr) {
int answer = 0, sum = 0;
for (int i = 0; i < k; i++) {
sum += arr[i];
}
answer = sum;
for (int i = k; i < n; i++) {
sum += arr[i];
sum -= arr[i - k];
answer = Math.max(answer, sum);
}
return answer;
}
}
'기타 > 코딩테스트' 카테고리의 다른 글
3-5. 연속된 자연수의 합 (0) | 2023.02.18 |
---|---|
3-4. 연속 부분수열 (0) | 2023.02.18 |
3-2. 공통 원소 구하기 (0) | 2023.02.18 |
3-1. 두 배열 합치기 (0) | 2023.02.18 |
2장 배열 주요개념 및 복습 노트 (0) | 2023.02.14 |