[백준][Java] 21921번 : 블로그

2025. 7. 12. 11:56·PS/백준

[문제 링크]

https://www.acmicpc.net/problem/21921


문제 설명

블로그를 시작한 지 N일이 지났을 때, X일 동안 가장 많이 들어온 방문자 수와 그 기간의 개수를 구해서 출력한다.

최대 방문자 수가 0명이면 SAD 출력

 

 

 

 

 

 

문제 풀이

  • 슬라이딩 윈도우 알고리즘을 활용한 문제
  • 첫 번째 X일 동안의 방문자수(1일차~X일차) 합을 먼저 구한다.
  • for문으로 한 칸씩 이동하면서 맨 앞의 값은 빼고 새로운 값을 더해서 구간의 합을 계산한다.

 

전체 코드

import java.io.*;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());   //블로그를 시작하고 지난 일수
        int x = Integer.parseInt(st.nextToken());   //최대 방문자수를 구하는 기간

        int[] days = new int[n];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            days[i] = Integer.parseInt(st.nextToken());
        }

        int visited = 0;
        //첫번째 X일 동안의 방문자 수
        for (int i = 0; i < x; i++) {
            visited += days[i];
        }

        int maxCnt = visited; //가장 많이 들어온 방문자 수
        int periodCnt = 1;  //기간의 개수
        for (int i = x; i < n; i++) {
            visited -= days[i - x];
            visited += days[i];

            if (visited > maxCnt) {
                maxCnt = visited;
                periodCnt = 1;
            } else if (visited == maxCnt) {
                periodCnt++;
            }
        }
        
        if (maxCnt == 0) {
            System.out.println("SAD");
        } else {
            System.out.println(maxCnt + "\n" + periodCnt);
        }
    }
}

 

 

 

 

시간초과 풀이

처음에 이중 for문을 사용해서 풀었는데 시간 초과가 떴다.

더보기
import java.io.*;
import java.util.StringTokenizer;

public class Main {

    static String[][] array;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());   //블로그를 시작하고 지난 일수
        int x = Integer.parseInt(st.nextToken());   //최대 방문자수를 구하는 기간

        int[] days = new int[n];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            days[i] = Integer.parseInt(st.nextToken());
        }

        int maxCnt = 0; //가장 많이 들어온 방문자 수
        int periodCnt = 0;  //기간의 개수

        for (int i = 0; i < n - x + 1; i++) {
            int visited = 0;
            for (int j = i; j < i + x; j++) {
                visited += days[j];
            }

            if (visited > maxCnt) {
                maxCnt = visited;
                periodCnt = 1;
            } else if (visited == maxCnt) {
                periodCnt++;
            }
        }

        if (maxCnt == 0) {
            System.out.println("SAD");
        } else {
            System.out.println(maxCnt + "\n" + periodCnt);
        }
    }
}
저작자표시 비영리 변경금지 (새창열림)

'PS > 백준' 카테고리의 다른 글

[백준][Java] 1149번 : rgb 거리  (1) 2025.07.21
[백준][Java] 13335번 : 트럭  (2) 2025.07.18
[백준][Java] 14719번 : 빗물  (4) 2025.07.10
[백준][Java] 1926번 : 그림  (0) 2025.07.01
[백준][Java] 20437번 : 문자열 게임 2  (1) 2025.06.30
'PS/백준' 카테고리의 다른 글
  • [백준][Java] 1149번 : rgb 거리
  • [백준][Java] 13335번 : 트럭
  • [백준][Java] 14719번 : 빗물
  • [백준][Java] 1926번 : 그림
nyrimmm
nyrimmm
  • nyrimmm
    개발기록
    nyrimmm
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (84)
      • Java (6)
      • Spring & SpringBoot (3)
      • Network (1)
      • DataBase (0)
      • SQL (1)
      • IntelliJ (3)
      • Git (0)
      • 자료구조 & 알고리즘 (2)
      • 트러블 슈팅 (1)
        • Spring (1)
      • PS (66)
        • 백준 (24)
        • 프로그래머스 (0)
        • SQL (9)
        • 이코테 (33)
      • 후기 & 회고 (1)
  • 태그

  • 인기 글

  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
nyrimmm
[백준][Java] 21921번 : 블로그
상단으로

티스토리툴바