백준 코딩테스트

[백준] 블로그 (21921) - Java

nan2 2023. 8. 2. 13:29
반응형

문제

찬솔이는 블로그를 시작한 지 벌써 일이 지났다.

요즘 바빠서 관리를 못 했다가 방문 기록을 봤더니 벌써 누적 방문 수가 6만을 넘었다.

 

찬솔이는 일 동안 가장 많이 들어온 방문자 수와 그 기간들을 알고 싶다.

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


입력

첫째 줄에 블로그를 시작하고 지난 일수 가 공백으로 구분되어 주어진다.

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


출력

첫째 줄에 일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다.

만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다.


제한

  •  1 ≤ X ≤ N ≤ 250,000
  •  0 ≤ 방문자 수 ≤ 8,000 

예제 입력 1 

5 2
1 4 2 5 1

예제 출력 1

7
1

예제 입력 2 

7 5
1 1 1 1 1 5 1

예제 출력 2 

9
2

예제 입력 3 

5 3
0 0 0 0 0

예제 출력 3 

SAD

 

 

내가 푼 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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 = new StringTokenizer(br.readLine());

        long N = Long.parseLong(st.nextToken()); //블로그시작한기간
        long X = Long.parseLong(st.nextToken()); //기간
        int[] A = new int[(int)N];
        int max_view_cnt = 0;       //최대 방문자수 카운트
        int max_day_cnt = 0;        //최대 방문자수 기간 카운트
        int curr_view_cnt = 0;      //현재 방문자수 카운트

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

        // 슬라이딩윈도우 시작 index
        for (int i=0; i<N-X+1; i++) {
            if (i == 0) {
                // 초기 세팅
                for (int j=0; j<X; j++) {
                    curr_view_cnt += A[j];
                }
                max_view_cnt = curr_view_cnt;
                max_day_cnt = 1;
            } else {
                curr_view_cnt = curr_view_cnt - A[i-1] + A[(int) (i+X-1)];

                if (curr_view_cnt == max_view_cnt)
                    max_day_cnt++;
                else if (curr_view_cnt > max_view_cnt) {
                    max_view_cnt = curr_view_cnt;
                    max_day_cnt = 1;
                }
            }
        }
        String result = max_view_cnt==0 ? "SAD" : max_view_cnt + "\n" + max_day_cnt;
        System.out.println(result);
    }
}

 

슬라이딩 윈도우란 정해진 범위만큼을 기준으로 인덱스를 +1 해주어 값을 구하는 방식이다.

입력 예제1을 보면 아래와 같다.

 

여기서 시작 index는 0부터 2까지 갈수있다. (X = 5)

 

이렇게 3가지 경우가 나올 수 있다.

 

 

인덱스0 인덱스1 인덱스2 인덱스3 인덱스4 인덱스5 인덱스6
1 1 1 1 1 5 1
1 1 1 1 1 5 1
1 1 1 1 1 5 1

 

처음 index == 0 인 경우 초기 값을 세팅해주기 위해 if문 분기로 빼주고

나머지는 index == 0 에서 구한 방문자 수에 이전 인덱스를 (-) 해주고 이후 인덱스를 (+) 해주는 방식으로 계산하면 된다.

 

반응형

'백준 코딩테스트' 카테고리의 다른 글

[백준] 괄호 (9012) - Java  (3) 2023.10.28
[백준] 요세푸스 문제 (1158) - Java  (0) 2023.10.28
[백준] DNA 비밀번호 (12891) - Java  (0) 2023.08.03
[백준] 주몽 (1940)  (0) 2023.08.01
[백준] 숫자의 합 (11720)  (0) 2023.07.27