길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

Algorithm/Greedy

[백준 2457번] 공주님의 정원 (C++)

2022. 5. 10. 03:25

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

 

2457번: 공주님의 정원

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

www.acmicpc.net


공주님의 정원 문제는 회의실 배정과 유사한 문제로, 그리디 알고리즘을 이용하여 해결할 수 있습니다. 

 

현재 피어 있는 꽃이 지기 전에 피고, 그 중 가장 늦게 지는 꽃을 선택하면 꽃을 최소의 개수로 선택할 수 있습니다.

 

⚠️ 주의할 점

  1. 빨리 피는 순으로 꽃을 정렬해야합니다.
  2. 현재 피어 있는 꽃이 지기 전에 피는 꽃이 없는 경우 0을 출력해야합니다. 
  3. 3월 2일 이전에 피는 꽃이 없으면 0을 출력해야합니다.
  4. 11월 30일 이후에 지는 꽃이 없으면 0을 출력해야합니다. 

 

아래는 전체 코드입니다.

#include <bits/stdc++.h>
using namespace std;

typedef struct{
    int s, e; // 꽃이 피는 일, 꽃이 지는 일
}flower;

int mtod(int month, int date){  // 월, 일을 입력 받아 일수로 변경하는 함수
    int day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    return accumulate(day, day + month, 0) + date;
}

bool cmp1(flower f1, flower f2){    // 꽃이 빨리 피는 순으로 정렬
    if(f1.s == f2.s) return f1.e < f2.e;
    return f1.s < f2.s; 
} 
bool cmp2(flower f1, flower f2){return f1.e > f2.e;} // 꽃이 늦게 지는 순으로 정렬

flower flowers[100010];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n; cin >> n;
    for(int i = 0; i < n; i++){
        int s1, s2, e1, e2;
        cin >> s1 >> s2 >> e1 >> e2;
        flowers[i] = {mtod(s1, s2), mtod(e1, e2)};    // 각 꽃의 정보 입력 받음
    } 

    sort(flowers, flowers + n, cmp2);   // 꽃이 늦게 지는 순으로 정렬
    if(mtod(12, 1) > flowers[0].e) {cout << 0 << "\n"; return 0;}    // 11월 30일 이후에 지는 꽃이 없으면 0 출력
    sort(flowers, flowers + n, cmp1);
    if(mtod(3, 1) < flowers[0].s) {cout << 0 << "\n"; return 0;}    // 3월 2일 이전에 피는 꽃이 없으면 0 출력

    int cur = 0;    // 3월 1일 이전에 피는 꽃 중 가장 늦게 피는 꽃의 idx
    for(int i = 1; i < n; i++){
        flower f = flowers[i];
        if(f.s <= mtod(3, 1))
            if(f.e > flowers[cur].e)
                cur = i;
    }

    int ans = 1;    // 선택한 꽃들의 최소 개수
    // cur은 현재 피어있는 꽃을 의미
    while(true){
        if(flowers[cur].e > mtod(11, 30)) break;    // 현재 피어있는 꽃이 11월 30일 이후에 지는 경우 반복을 종료

        flower l = {1, 1}; // 가장 늦게 지는 꽃
        int l_idx = -1; // 가장 늦게 지는 꽃의 인덱스
        for(int i = cur + 1; i < n; i++){   
            flower f = flowers[i];
            if(f.s <= flowers[cur].e){    // 현재 피어있는 꽃이 지기 전에 피고,     
                if(f.e > l.e){  // 그 중 가장 늦게 지는 꽃을 찾음
                    l = f;
                    l_idx = i;
                }        
            }
        }

        cur = l_idx;    // 현재 피어있는 꽃의 인덱스 변경

        if(l.s == 1){    // 현재 피어있는 꽃이 지기 전에 피는 꽃이 없는 경우
            cout << 0 << "\n"; return 0;
        }else{ans++;}   // 선택한 꽃의 개수 증가
    }

    cout << ans;
}

 

아래는 문제 풀이에 사용된 테스트케이스입니다.

8
4 12 6 5
5 2 5 31
9 14 12 24
6 15 9 3
6 3 6 15
6 15 9 27
10 5 12 31
7 14 9 1
-> 0

'Algorithm > Greedy' 카테고리의 다른 글

[백준 1744번] 수 묶기 (C++)  (0) 2022.05.10
[백준 11501번] 주식 (C++)  (0) 2022.05.10
[백준 1026번] 보물 (C++)  (0) 2022.05.09
[백준 2217번] 로프 (C++)  (0) 2022.05.09
[백준 11047번] 동전 0 (C++)  (0) 2022.04.07
    'Algorithm/Greedy' 카테고리의 다른 글
    • [백준 1744번] 수 묶기 (C++)
    • [백준 11501번] 주식 (C++)
    • [백준 1026번] 보물 (C++)
    • [백준 2217번] 로프 (C++)
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바