[BJ21921] 블로그

 

 

 백준 - 블로그 

문제 링크

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

 

21921번: 블로그

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

www.acmicpc.net

 

문제 입출력

5 2
1 4 2 5 1
7
1

 

문제 풀이

package problem.BJ;


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

/*
 * [입력]
 * N(블로그를 시작하고 지난 일수) X(부분문자의 길이)
 * hit(매일마다 블로그 방문자수)
 * return  X일 만큼 최대 방문자수와 그런 기간의 갯
 * 
 * [주의]
 * - 최대 방문자수가 0명이라면 SAD 출력 
 * */


public class BJ21921_블로그 {
	static int N, X, cnt = 1;
	static int[] hit; // 블로그 방문자 수
	static StringBuilder sb = new StringBuilder();


	// 슬라이딩 윈도우 기법 사용
	public static void solve() {
		// X일 마다의 방문자수의 합
		int sum = 0;
		for (int i = 0; i < X; i++) {
			sum += hit[i];
		}

		// 최대 방문자 수
		int max = sum;

		for (int i = X; i < N; i++) {
			sum -= hit[i - X]; // 첫 요소 제외
			sum += hit[i]; // 새롭게 나타나는 요소 더하기

			// 최댓값 갱신
			if (max < sum) {
				cnt = 0; // 최댓값 갱신되면 카운팅 0으로 초기화
				cnt++;
				max = sum;
			} else if (max == sum) cnt++; // 최댓값과 같은 기간이 나오면 카운팅

		}

		if (max == 0) {
			// 만약 최대방문자수가 0명이라면 SAD 출력
			System.out.println("SAD");
			return;
		}

		sb.append(max + "\n").append(cnt);
		System.out.println(sb.toString());
		return;

	}


	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// 변수 입력
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		X = Integer.parseInt(st.nextToken());
		hit = new int[N];

		// 배열 입력
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {
			hit[i] = Integer.parseInt(st.nextToken());
		}

		solve();

	}
}

슬라이딩 윈도우 기법을 사용.

만약 max 값을 갱신하면 cnt 가 0으로 초기화가 된다.

 

 

 

 

 

 

 

 

 

# 백준 블로그 java # BJ21921 블로그 java


 

728x90