Algorithm

[Algo] 백준 3020 개똥벌레 JAVA

조핑구 2024. 5. 7. 14:33

문제 바로가기 : https://www.acmicpc.net/problem/3020

메모리 : 37312KB

시간 : 492ms

언어 : Java 11


코드

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

public class Main {

    public static <T> void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int H = Integer.parseInt(st.nextToken());
        int[] top = new int[H + 1];// 종유석
        int[] down = new int[H + 1];// 석순

        for (int i = 1; i <= N; i++) {
            int tmp = Integer.parseInt(br.readLine());
            if (i % 2 == 0) { // 종유석
                top[tmp]++;
            } else { // 석순
                down[tmp]++;
            }
        }
        int[] cnt = new int[H + 1];
        int tmp = 0;
        for (int i = H; i > 0; i--) {
            tmp += down[i];
            cnt[H + 1 - i] += tmp;
        }
        tmp = 0;
        for (int i = H; i > 0; i--) {
            tmp += top[i];
            cnt[i] += tmp;
        }
        Arrays.sort(cnt);
        int anscnt = 1;
        for (int i = 2; i <= H; i++) {
            if (cnt[1] == cnt[i])
                anscnt++;
            else
                break;
        }
        System.out.printf("%d %d", cnt[1], anscnt);
    }
}

풀이

종유석과 석순이 번갈아가며 홀짝으로 등장하는데, 이것을 각각 다른 배열에 받아 cnt배열에 합쳐 계산한다.
가장 높은 석순은 밑에도 당연히 존재하기때문에 누적합의 개념으로 tmp를 만들어주면 된다.