[백준] 20207: 달력 - JAVA

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

풀이

일정들의 시작, 종료 날짜가 주어지고, 달력에 배치해야 한다.

달력에 배치할 때 주의해야 할 규칙은 다음과 같다.

  • 시작일이 가장 앞선 일정부터 차례대로 채워진다.

  • 시작일이 같을 경우 일정의 기간이 긴 것이 먼저 채워진다.

  • 일정은 가능한 최상단에 배치된다.

365일만큼 배열을 만들고, 일정이 있는 구간에 +1하여 누적합했다.

빈칸이 있으면 최상단에 배치되기때문에 누적합하여 높이와 길이를 정할 수 있기 때문이다.

일정이 없는 날짜가 나오면 이전까지 누적했던 길이 * 높이를 답에 더해주었다.


메모리: 14480KB

시간: 136ms

언어: Java 11

코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        StringTokenizer st;
        int[] calendar = new int[365 + 2];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            calendar[start]++;
            calendar[end + 1]--;
        }

        int answer = 0;
        int length = 0;
        int height = 0;
        for (int i = 1; i < calendar.length; i++) {
            calendar[i] += calendar[i - 1];
            if (calendar[i] == 0) {
                answer += length * height;
                length = 0;
                height = 0;
            } else {
                length++;
                height = Math.max(calendar[i], height);
            }
        }

        System.out.println(answer);
    }

}