본문 바로가기

BOJ/Node.js

[BOJ / Node.js] 21921. 블로그

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