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};
}
}
'알고리즘' 카테고리의 다른 글
백준 20922번 겹치는 건 싫어(JAVA) (1) | 2024.01.06 |
---|---|
백준 2565번 전깃줄 (JAVA) (0) | 2024.01.05 |
백준 2792번 보석 상자 (JAVA) (0) | 2024.01.03 |
백준 21317번 징검다리 건너기 (JAVA) (1) | 2024.01.02 |
백준 16197번 두 동전 (JAVA) (1) | 2024.01.01 |