3020 - 개똥벌레

Byung Seon Kang·2022년 10월 22일

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

class Main {
    static int N,H,rangeCount=0, stalactiteCount = Integer.MAX_VALUE;
    static int[] ceilingAccumulate, floorAccumulate;


    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        H = Integer.parseInt(st.nextToken());
        ceilingAccumulate = new int[H+1];
        floorAccumulate = new int[H+1];
        for(int i=0; i<N; i++){
            int stalactite = Integer.parseInt(br.readLine());
            if(i%2==1) ceilingAccumulate[stalactite]+=1;
            else floorAccumulate[stalactite] += 1;
        }

        for(int i=H-1; i>=0; i--){
            ceilingAccumulate[i] += ceilingAccumulate[i+1];
            floorAccumulate[i] += floorAccumulate[i+1];
        }

        for(int i=1; i<=H; i++){
            int toAvoid = floorAccumulate[i] + ceilingAccumulate[H-i+1];
            if(toAvoid < stalactiteCount){
                stalactiteCount = toAvoid;
                rangeCount = 1;
            }else if(toAvoid == stalactiteCount){
                rangeCount++;
            }
        }

        System.out.println(stalactiteCount+ " " + rangeCount);
    }

}
  • 천장의 종유석과 바닥의 종유석 각각 누적합으로 저장한다.
    • floorAccumulate[i]는 바닥에 붙어있는 i이상의 높이를 가진 종유석의 개수를 저장.
    • 천장도 마찬가지로 저장
  • 이후 floorAccumulate[i] + ceilingAccumulate[H-i+1]가 최소가 되는 경우를 찾고 그 개수를 세면 된다.
profile
왜 필요한지 질문하기

0개의 댓글