๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 11000 ๊ฐ•์˜์‹ค ๋ฐฐ์ • priority-queue, greedy

by Jouureee 2021. 3. 7.

๋ฌธ์ œ :

www.acmicpc.net/problem/11000

 

11000๋ฒˆ: ๊ฐ•์˜์‹ค ๋ฐฐ์ •

์ฒซ ๋ฒˆ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 200,000) ์ดํ›„ N๊ฐœ์˜ ์ค„์— Si, Ti๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Si < Ti ≤ 109)

www.acmicpc.net

 

๋ถ„์„ :

์ด ๋ฌธ์ œ๋Š” ์–ธ๋œป ๋ณด๋ฉด 19598๋ฒˆ ์ตœ์†Œ ํšŒ์˜์‹ค ๊ฐœ์ˆ˜ ๋ฌธ์ œ์™€ ๋น„์Šทํ•ด ๋ณด์ธ๋‹ค.

ํ•˜์ง€๋งŒ N์˜ ๋ฒ”์œ„๊ฐ€ 200,000d์œผ๋กœ O(N^2)์œผ๋กœ ํ’€๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค ๐Ÿ˜ข

๊ทธ๋ž˜์„œ ์ž๋™์œผ๋กœ ๊ฐ•์˜ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ์งง์€ ์นœ๊ตฌ ์ˆœ์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค. (์ฒ˜์Œ ์จ๋ณธ๋‹ค .. ํ•˜ํ•˜)

 

์šฐ์„  ์ˆœ์œ„ํ๋Š” 

์ž๋ฃŒํ˜• T, Container, ์‚ฌ์šฉ์ž ์ •์˜ ๋น„๊ต ์—ฐ์‚ฐ(struct, class - operator ์—ฐ์‚ฐ์ž) ์ด 3๊ฐ€์ง€๋ฅผ ์ •์˜ํ•ด ์ค˜์•ผ ํ•˜๊ณ  

pq.pop์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์šฐ์„ ์ˆœ์œ„ ์ˆœ์œผ๋กœ ๋จผ์ € ๋‚˜๊ฐ€๊ฒŒ ๋œ๋‹ค. 

 

๊ตฌ์ƒํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 

1. ์šฐ์„  v ๋ฒกํ„ฐ์— pair ์ž๋ฃŒํ˜•์œผ๋กœ start, end ๋ฅผ ๋„ฃ์–ด ๋ฐฐ์—ด ์ƒ์„ฑ

2. v ๋ฒกํ„ฐ ์‹œ์ž‘ ์‹œ๊ฐ„ ๋น ๋ฅธ ์ˆœ์œผ๋กœ sort

3. ์šฐ์„ ์ˆœ์œ„ ํ pq์— v ๋ฒกํ„ฐ ์ฒซ๋ฒˆ์งธ ์›์†Œ ์‚ฝ์ž… 

4. v๋ฒกํ„ฐ 1๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ๋น„๊ต

4-1) ์šฐ์„ ์ˆœ์œ„ ํ pq์— ์žˆ๋Š” ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ๋น ๋ฅธ ํšŒ์˜๊ฐ€ v ๋ฒกํ„ฐ ์‹œ์ž‘ ์‹œ๊ฐ„๋ณด๋‹ค ํฌ๋‹ค๋ฉด 

๋‹ค๋ฅธ ๊ฐ•์˜์‹ค์„ ํ• ๋‹นํ•ด์ค˜์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ cnt ์ฆ๊ฐ€, ์šฐ์„  ์ˆœ์œ„ ํ์— push

4-2) ์šฐ์„ ์ˆœ์œ„ ํ pq์˜ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๋‹ค์Œ ํšŒ์˜ ์‹œ์ž‘ ์‹œ๊ฐ„๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ํšŒ์˜ ์ด์–ด์„œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 

cnt ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๊ณ , ์šฐ์„  ์ˆœ์œ„ ํ์— push 

 

 

c++ ์ฝ”๋“œ :

//
//  11000_lecture_room.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2021/03/07.
//

#include <stdio.h>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;
vector<pair<int, int>> v;

bool startTime(const pair<int, int> &a, const pair<int, int> &b){
    if(a.first == b.first){
        return a.second < b.second;
    }
    return a.first < b.first;
}

struct compare {
    bool operator()(const pair<int, int> &a, const pair<int, int> &b){
        if(a.second == b.second){
            //๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๊ฐ™์œผ๋ฉด ์‹œ์ž‘ ์‹œ๊ฐ„์ด ๋น ๋ฅธ ์ˆœ
            return a.first > b.first;
        }
        //๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๋น ๋ฅธ ์ˆœ
        return a.second > b.second;
    }
};

priority_queue<pair<int, int>, vector<pair<int, int>>, compare> pq;




int find_room_count(int n){
    int cnt = 1;
    sort(v.begin(), v.end(), startTime);
    //์ •๋ ฌ๋œ ์ฒซ๋ฒˆ์งธ ์›์†Œ ์‚ฝ์ž…(์‹œ์ž‘ ์‹œ๊ฐ„ ๋น ๋ฅธ ์ˆœ)
    pq.push(v.at(0));
    
    for(int i = 1; i < n; i++){
        if(pq.top().second > v.at(i).first){
            pq.push(v.at(i));
            cnt++;
        }else{
            pq.pop();
            pq.push(v.at(i));
        }
    }
    return cnt;
    
}

int main(){
    int n;
    scanf("%d", &n);
    
    for(int i =0; i < n; i++){
        int start, end;
        scanf("%d %d", &start, &end);
        v.push_back(make_pair(start, end));
    }
    
    int count = find_room_count(n);
    printf("%d", count);
    
    return 0;
}

๋Œ“๊ธ€