카테고리 없음

[백준] Silver III. 블로그

미네구스 2024. 7. 17. 00:06

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

 

 

사용 알고리즘
  • 투 포인터

 

풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Arrays;

public class Main {
    static int n, x; // n: 일 수, x: 구간
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        x = Integer.parseInt(st.nextToken());

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

        int hi = 0;
        int res = arr[0];
        int max = Integer.MIN_VALUE;
        int count = 1;

        for(int lo = 0; lo < n; lo++) {
            while (hi < n && hi - lo + 1 < x) {
                hi++;
                if (hi != n) res += arr[hi];
            }

            if (hi - lo + 1 < x) break;

            if (res > max) count = 1;
            else if (res == max) count++;

            max = Math.max(max , res);
            res -= arr[lo];

        }

        if (max == 0) {
            System.out.println("SAD");
        }
        else {
            System.out.println(max);
            System.out.println(count);
        }
    }
}

 

 

회고

 

처음에 반례를 찾지 못해서 고민하다가, 질문 계시판에서 내 케이스에 딱 맞는 반례를 발견했다.

입력값
4 2
1 2 1 7

출력값
8 2

기대값
8 1

 

가장 많이 들어온 방문자 수 뿐만 아니라 기간도 같이 구해야 한다.

 

기존 코드에선 max를 갱신해주기 전에, res == max일 때만 count에 1을 더해주었다. 여기서 edge case는 저 예제에서도 찾아볼 수 있듯이, 최대값이 8이 아닌 3일때도 count를 업데이트 시켜주고 있다.

 

즉, res값이 max보다 크다는 뜻은 기존 값보다 더 큰 방문자 수를 찾았다는 뜻이므로 다시 1로 초기화 해줘야한다.

 

이외에는 정석적인 투포인터 문제였다.