728x90
https://www.acmicpc.net/problem/21921
21921번: 블로그
첫째 줄에 $X$일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다. 만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다
www.acmicpc.net
문제
찬솔이는 블로그를 시작한 지 벌써 일이 지났다.
요즘 바빠서 관리를 못 했다가 방문 기록을 봤더니 벌써 누적 방문 수가 6만을 넘었다.

찬솔이는 일 동안 가장 많이 들어온 방문자 수와 그 기간들을 알고 싶다.
찬솔이를 대신해서 일 동안 가장 많이 들어온 방문자 수와 기간이 몇 개 있는지 구해주자.
입력
첫째 줄에 블로그를 시작하고 지난 일수 와 가 공백으로 구분되어 주어진다.
둘째 줄에는 블로그 시작 일차부터 일차까지 하루 방문자 수가 공백으로 구분되어 주어진다.
출력
첫째 줄에 일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다.
만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다.
제한
- 1 ≤ X ≤ N ≤ 250,000
- 0 ≤ 방문자수 ≤ 8,000
예제 입력 1
5 2
1 4 2 5 1
Solve
- 입력 제한사항을 확인하여, 이중 for문을 사용하여 탐색할 경우 시간초과가 날 것임을 확인하고, 슬라이딩 윈도우 알고리즘을 사용하여 풀이함.
Code
const arr = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n")
.map((el) => el.trim());
const [n, x] = arr[0].split(" ").map((el) => +el);
const numbers = arr[1].split(" ").map((el) => +el);
// 구해야 하는 것 x일 동안의 방문자수 최대값, 최대값이 나온 횟수
let sum = 0;
let count = {};
for (let i = 0; i < x; i++) {
sum += numbers[i];
}
let max = sum;
count[sum] = 1;
for (let i = x; i < n; i++) {
sum = sum - numbers[i - x] + numbers[i];
if (max <= sum) {
max = sum;
count[max] = (count[max] || 0) + 1;
}
}
console.log(max === 0 ? "SAD" : max);
if (max) console.log(count[max]);
'BOJ > Node.js' 카테고리의 다른 글
[BOJ / Node.js] 2559. 수열 (0) | 2023.02.18 |
---|---|
[BOJ / Node.js] 1920. 수 찾기 (0) | 2023.02.17 |
[BOJ / Node.js] 17070. 파이프 옮기기1 (0) | 2023.02.09 |
[BOJ / Node.js] 15666. N과 M(12) (0) | 2023.02.08 |
[BOJ / Node.js] 15663. N과 M(9) (0) | 2023.02.07 |