알고리즘

백준 21921번 블로그 (JAVA)

박카스마시며코딩 2024. 1. 4. 22:06

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

 

21921번: 블로그

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

www.acmicpc.net

 

저는 투포인트를 통해 문제를 풀었습니다.

투포인트로 그 사이 간격이 x인 경우 그 사이의 합을 구하고, 이 값들의 최대 값을 추적하여 문제를 해결하였습니다.

 

package BOJ.twopoint;

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

public class BOJ_21921_2 {
    public static void main(String[] args) throws Exception {
        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());
        st = new StringTokenizer(br.readLine());
        int[] visitedCnt = new int[n];
        for(int i = 0 ; i < n ; i++){
            visitedCnt[i] = Integer.parseInt(st.nextToken());
        }
        int[] result = cal(visitedCnt,x,n);
        if(result[0] == 0){
            System.out.println("SAD");
        }else{
            System.out.println(result[0]);
            System.out.println(result[1]);
        }
    }

    private static int[] cal(int[] visitedCnt, int x, int n) {
        int sum = 0;
        int maxSum = 0;
        int startIndex = 0;
        int endIndex = 0;
        int cnt = 0;
        while(true){
            if(endIndex - startIndex < x){
                if(endIndex == n){
                    break;
                }
                sum += visitedCnt[endIndex++];
                continue;
            }
            if(endIndex - startIndex == x){
                if(maxSum < sum){
                    maxSum = sum;
                    cnt = 1;
                }else if(maxSum == sum){
                    cnt++;
                }
                sum -= visitedCnt[startIndex++];
            }
        }
        return new int[]{maxSum, cnt};
    }
}