자료구조&알고리즘/백준

21921번: 블로그 [JAVA]

yong_ღ'ᴗ'ღ 2023. 8. 18. 21:28

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

 

21921번: 블로그

첫째 줄에 $X$일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다. 만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다

www.acmicpc.net

 

접근 방식) 누적합

1. 누적합배열(prefixSum) 생성하고, 방문자 수 입력받으면 바로 누적합 배열에 값 넣어준다.

    prefixSum[i] = prefixSum[i - 1] + 현재 입력 값  → 이므로, prefixSum = new int[N + 1] 로 만들어준다.

2. X일 동안 방문자 최댓값(max)을 찾고, 배열을 하나 더 만들어서 X일 동안의 누적합을 저장했다.(prefixSumX)

3. max가 0이면 SAD를 출력, 아니면 prefixSumX 배열 돌면서 max와 같은 개수 세서 결과값 출력해준다.

 

package codingTestStudy.week4;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class B_21921 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int X = Integer.parseInt(st.nextToken());

        int[] prefixSum = new int[N + 1];
        st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= N; i++)
            prefixSum[i] = prefixSum[i - 1] + Integer.parseInt(st.nextToken());

        // X일 동안 방문자 최댓값 찾기
        int max = Integer.MIN_VALUE;
        int[] prefixSumX = new int[prefixSum.length];   // X일 동안의 누적합 저장
        for (int i = X, j = 0; i <= N; i++, j++) {
            max = Math.max(max, prefixSum[i] - prefixSum[j]);
            prefixSumX[i] = prefixSum[i] - prefixSum[j];
        }

        StringBuilder sb = new StringBuilder();
        if (max == 0) {
            sb.append("SAD");
        } else {
            int count = 0;
            for (int i = X; i < prefixSumX.length; i++) {
                if (prefixSumX[i] == max)
                    count++;
            }
            sb.append(max).append('\n');
            sb.append(count).append('\n');
        }
        System.out.println(sb);
    }
}