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

 

2457번: 공주님의 정원

첫째 줄에는 꽃들의 총 개수 N (1<=N<=100,000)이 주어진다. 다음 N개의 줄에는 각 꽃이 피는 날짜와 지는 날짜가 주어진다. 하나의 날짜는 월과 일을 나타내는 두 숫자로 표현된다. 예를 들어서, 3 8 7

www.acmicpc.net

백준 2457 공주님의 정원 문제입니다.

이 문제는 그리디 문제입니다.

바로 정답을 말하자면 필요한 기간동안 피어있을 수 있는 모든 꽃을 찾은 다음 해당 꽃중 가장 오랫동안 피어있을 수 있는 꽃을 찾으면 됩니다.

이 때 주의해야할 것은 경계가 모호할 수 있으므로 명확히 처리해주는 것이 필요합니다

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

public class Main {
    static int N;
    static int[] monthDay = {31,28,31,30,31,30,31,31,30,31,30,31};
    public static class Flower implements Comparable<Flower>{
        public int start;
        public int end;

        public Flower (int start, int end){
            this.start = start;
            this.end = end;
        }

        public int compareTo(Flower flower){
            if(start < flower.start) return -1;
            else if(start == flower.start){
                if(end < flower.end) return -1;
                else return 1;
            }
            else return 1;
        }
    }

    static PriorityQueue<Flower> pq = new PriorityQueue<Flower>();

    private static int dateToInteger(int month, int day){
        int dateInt = 0;
        for(int i=0;i<month-1;i++){
            dateInt += monthDay[i];
        }
        dateInt += day;
        return dateInt;
    }
    public static void main(String args[]) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(bf.readLine());
        for(int i=0;i<N;i++){
            StringTokenizer st = new StringTokenizer(bf.readLine());
            int startMonth = Integer.parseInt(st.nextToken());
            int startDay = Integer.parseInt(st.nextToken());
            int endMonth = Integer.parseInt(st.nextToken());
            int endDay = Integer.parseInt(st.nextToken());
            int startDateInteger = dateToInteger(startMonth, startDay);
            int endDateInteger = dateToInteger(endMonth, endDay);
            if(startDateInteger >= endDateInteger) continue;
            pq.add(new Flower(startDateInteger, endDateInteger - 1));
        }
        int needMn = dateToInteger(3, 1);
        int needMx = dateToInteger(11, 30);
        int mx = dateToInteger(3, 1);
        int cnt = 0;
        boolean flag = false;
        while(true){
            if(pq.isEmpty() || pq.peek().start > needMn){
                if(!flag) break;
                flag = false;
                cnt++;
                needMn = mx+1;
                if(mx >= needMx) {
                    flag = true;
                    break;
                }
                if(pq.isEmpty()) break;
            }
            Flower flower = pq.poll();
            // System.out.println(flower.start + " " + flower.end);
            mx = Math.max(mx,flower.end);
            flag = true;
        }
        System.out.println(flag?cnt:0);
        
    }
}

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

[백준 2309] 일곱 난쟁이  (0) 2021.01.22
[프로그래머스] 보석 쇼핑  (0) 2021.01.03
[백준 2470] 두 용액  (0) 2021.01.01
[백준 1806] 부분합  (0) 2021.01.01
[백준 20167] 꿈틀꿈틀 호석 애벌레 - 기능성  (0) 2020.12.29

+ Recent posts