[백준] 21921 블로그 JavaScript

·2024년 6월 25일

문제

찬솔이는 블로그를 시작한 지 벌써 N일이 지났다.
요즘 바빠서 관리를 못 했다가 방문 기록을 봤더니 벌써 누적 방문 수가 6만을 넘었다.

찬솔이는 X일 동안 가장 많이 들어온 방문자 수와 그 기간들을 알고 싶다.
찬솔이를 대신해서 X일 동안 가장 많이 들어온 방문자 수와 기간이 몇 개 있는지 구해주자.

입력

첫째 줄에 블로그를 시작하고 지난 일수 N와 X가 공백으로 구분되어 주어진다.
둘째 줄에는 블로그 시작 1일차부터 N일차까지 하루 방문자 수가 공백으로 구분되어 주어진다.

1 <= X <= N <= 250,000
0 <= 방문자 수 <=8,000

출력

첫째 줄에 X일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다.
만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다.

예제 입력

5 2
1 4 2 5 1

예제 출력

7
1

내가 했던 풀이 방법

  1. vistant 배열을 순회하면서 index가 X-1보다 작을 때까지는 방문자 수를 sum에 더해준다. index가 X-1이 되었을 때는 sum에 방문자 수를 더해주고 sum을 max에 저장하고 count를 1로 저장한다. 그 외의 경우에는 sum에 방문자 수를 더해주고 i-X 위치의 방문자 수를 sum에서 제거해준다. 그 값이 max보다 클 경우 max를 sum으로 바꿔주고 count를 1로 바꿔준다. max와 sum이 같을 경우에는 count를 1 증가시켜준다. (예를 들어 위 예시에서 i가 2일 때, max과 sum이 5이다. 이때 2번째 index의 방문자 수인 2를 더해주고, 0번째 index의 방문자 1를 제거해주면 sum은 6이 된다. 이는 max보다 큰 수이므로, max를 sum(6)으로 바꿔주고 count를 1로 바꿔준다.)
  2. 모든 연산이 끝난 뒤 max가 0이면 SAD를 출력하고, 0이 아니라면 max와 count를 출력해준다.

코드

const fs = require('fs');
let [n, visitants] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');
let visitant = visitants.trim().split(' ').map(Number);

const N = Number(n.trim().split(' ')[0]);
const X = Number(n.trim().split(' ')[1]);
let max = 0;
let count = 0;
let sum = 0;

for (let i = 0; i < visitant.length; i++) {
  if (i < X - 1) {
    sum += visitant[i];
  } else if (i === X - 1) {
    sum += visitant[i];
    max = sum;
    count = 1;
  } else {
    sum += visitant[i];
    sum -= visitant[i - X];
    if (sum > max) {
      max = sum;
      count = 1;
    } else if (sum === max) {
      count++;
    }
  }
}

if (max === 0) {
  console.log('SAD');
} else {
  console.log(max);
  console.log(count);
}

회고

누적 합을 생각하긴 했는데 딱히 시간 초과가 날거라고 생각 못해서 간단하게 구현하려다가 시간초과 발생한 문제. 귀찮더라도 효율적인 방법이 떠오르면 효율적으로 풀자.. 실버 3인데 간단하게 구현하려고 한 내 문제인 듯하다...

profile
Frontend🍓

0개의 댓글