개발놀이터

3-3. 최대 매출 본문

기타/코딩테스트

3-3. 최대 매출

마늘냄새폴폴 2023. 2. 18. 09:39

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