자료구조&알고리즘/백준
21921번: 블로그 [JAVA]
yong_ღ'ᴗ'ღ
2023. 8. 18. 21:28
https://www.acmicpc.net/problem/21921
21921번: 블로그
첫째 줄에 $X$일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다. 만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다
www.acmicpc.net
접근 방식) 누적합
1. 누적합배열(prefixSum) 생성하고, 방문자 수 입력받으면 바로 누적합 배열에 값 넣어준다.
prefixSum[i] = prefixSum[i - 1] + 현재 입력 값 → 이므로, prefixSum = new int[N + 1] 로 만들어준다.
2. X일 동안 방문자 최댓값(max)을 찾고, 배열을 하나 더 만들어서 X일 동안의 누적합을 저장했다.(prefixSumX)
3. max가 0이면 SAD를 출력, 아니면 prefixSumX 배열 돌면서 max와 같은 개수 세서 결과값 출력해준다.
package codingTestStudy.week4;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class B_21921 {
public static void main(String[] args) throws IOException {
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());
int[] prefixSum = new int[N + 1];
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= N; i++)
prefixSum[i] = prefixSum[i - 1] + Integer.parseInt(st.nextToken());
// X일 동안 방문자 최댓값 찾기
int max = Integer.MIN_VALUE;
int[] prefixSumX = new int[prefixSum.length]; // X일 동안의 누적합 저장
for (int i = X, j = 0; i <= N; i++, j++) {
max = Math.max(max, prefixSum[i] - prefixSum[j]);
prefixSumX[i] = prefixSum[i] - prefixSum[j];
}
StringBuilder sb = new StringBuilder();
if (max == 0) {
sb.append("SAD");
} else {
int count = 0;
for (int i = X; i < prefixSumX.length; i++) {
if (prefixSumX[i] == max)
count++;
}
sb.append(max).append('\n');
sb.append(count).append('\n');
}
System.out.println(sb);
}
}