안드 공부를 해볼까?

[Java] 백준 달력 본문

알고리즘/백준

[Java] 백준 달력

문바리 2022. 8. 16. 21:04
728x90

1. 문제 분석

문제만 봐서는 무슨말을 하는지 모르겠다. 밑의 그림을 보자.

각 날짜마다 일정이 있고 곂치는 일정이 있으면 밑으로 추가된다.

또, 일정이 없는날이면 포함되지 않아서 따로 계산도 해줘야한다.

 

여기서 구분해야하는건 2가지다.

1. 일정이 중첩

2. 일정이 없는날

1번은 중첩이 될 수록 직사각형의 높이가 될 것이다. 즉, 인덱스를 이용하면 편할 것이다.

2번은 일정이 없다면 직사각형이 종료되는 시점이다. 그 전까지의 값을 구해주면 된다.

2. 구현

import java.io.*;
import java.nio.Buffer;
import java.util.*;

public class Main {

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

        int[] arr = new int[367];
        int max = 0;
        int width = 0;
        int height = 0;
        int result = 0;

        //input
        for (int i = 0; i < count; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            for (int j = start; j <= end; j++) {
                arr[j]++;
            }
            max = Math.max(max, end);
        }
        //calc
        for (int i = 1; i <= max+1; i++) {
            if (arr[i] == 0) {
                result += width * height;
                width = 0;
                height = 0;
            } else {
                height = Math.max(height, arr[i]);
                width++;
            }
        }
        System.out.println(result);
    }
}

arr에 일정들을 관리해줬다. 일정이 있다면 1을 더해준다.
또한, max를 설정해서 for문을 적게 돌리게 했다.

 

calc부분에서 arr의 값이 0이면 직사각형을 계산하는 것이다.

세로는 그 중 가장 큰 값이고 가로는 0이 나오기전까지 1씩 더해준다.

3. 마무리

구현문제가 내 적성에 맞는건지 문제 풀면서 답지 안본게 오랜만이다.

이렇게 매일 문제를 풀어야하는데..

반응형

'알고리즘 > 백준' 카테고리의 다른 글

[Java] 백준 귀여운 라이언  (0) 2022.08.16
[Java] 백준 배열 돌리기  (0) 2022.08.16
[Java] 백준 수들의 합 2  (0) 2022.08.16
[Java] 백준 퇴사 2  (0) 2022.08.09
[Java] 백준 동전 2  (0) 2022.08.06
Comments