[알고리즘] 백준 21921 - 블로그

홍예주·2022년 3월 4일

알고리즘

목록 보기
52/92

1. 문제

https://www.acmicpc.net/problem/21921
찬솔이는 블로그를 시작한 지 벌써 NN일이 지났다.

요즘 바빠서 관리를 못 했다가 방문 기록을 봤더니 벌써 누적 방문 수가 6만을 넘었다.

찬솔이는 XX일 동안 가장 많이 들어온 방문자 수와 그 기간들을 알고 싶다.

찬솔이를 대신해서 XX일 동안 가장 많이 들어온 방문자 수와 기간이 몇 개 있는지 구해주자.

2. 입력

첫째 줄에 블로그를 시작하고 지난 일수 NN와 XX가 공백으로 구분되어 주어진다.
둘째 줄에는 블로그 시작 11일차부터 NN일차까지 하루 방문자 수가 공백으로 구분되어 주어진다.

3. 풀이

투포인터를 이용해 풀 수 있다.
X일 만큼의 범위로 포인터를 옮겨서 방문자 수의 최대합을 갱신한다.

4. 코드


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

public class blog_21921 {
    public static void solution() throws IOException{
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(bf.readLine());

        int n = Integer.parseInt(st.nextToken());
        int x = Integer.parseInt(st.nextToken());

        int[] arr = new int[n];

        st = new StringTokenizer(bf.readLine());
        for(int i=0;i<n;i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int end = 0;
        int sum = 0;
        int max = 0;
        int count = 1;

        for(int i=0;i<n;i++){
            while((end-i<x) && end<n){
                sum += arr[end];
                end++;
            }

            if(max == sum){
                count++;
            }
            else if(max<sum){
                max = sum;
                count = 1;
            }

            sum -=arr[i];
        }

        if(max == 0){
            System.out.println("SAD");
            return;
        }

        System.out.println(max);
        System.out.println(count);
    }
}

profile
기록용.

0개의 댓글