알고리즘
백준 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};
}
}